如果參數是文件,我想將其擴展名更改爲.file
。使用sed更改文件擴展名
這就是我的了:
#!/bin/bash
while [ $# -gt 0 ]
do
if [ -f $1 ]
then
sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1
fi
shift
done
腳本運行,但它不會做任何事情。另一個問題是該文件沒有任何擴展名,我的sed命令不起作用,對吧?請幫忙。
如果參數是文件,我想將其擴展名更改爲.file
。使用sed更改文件擴展名
這就是我的了:
#!/bin/bash
while [ $# -gt 0 ]
do
if [ -f $1 ]
then
sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1
fi
shift
done
腳本運行,但它不會做任何事情。另一個問題是該文件沒有任何擴展名,我的sed命令不起作用,對吧?請幫忙。
sed用於操作文件的內容,而不是文件名本身。
選項1,從this answer by John Smith採取:
filename="file.ext1" mv "${filename}" "${filename/%ext1/ext2}"
選項2,從this answer by chooban採取:
rename 's/\.ext/\.newext/' ./*.ext
選項3,從this answer by David W.採取:
$ find . -name "*.ext1" -print0 | while read -d $'\0' file do mv $file "${file%.*}.ext2" done
,更是here。
UPDATE:(在評論問%和{}做?)
「$ {}變量othter_chars」>如果你想擴大在字符串的變量,你可以使用它。和%.*
在{}
裝置從例如值的尾部取可變帶的值off圖案.*
如果變量是filename.txt
「$ {變量%。*}只返回filename
。
文件的擴展名沒有給出。它可以是.txt或.file或任何東西。我希望腳本不關心這一點。 –
這並不是什麼大不了的事,你可以在選項3中使用'「*。*」''''''''''''''''''''''來獲得任何擴展名的文件名。 –
Ty,man。它正在工作。你能告訴我,請問%和{}做什麼?這是我第一次使用它們。 –
使用殼功能包一個sed
評估(e
)命令:
mvext()
{
ext="$1";
while shift && [ "$1" ]; do
sed 's/.*/mv -iv "&" "&/
s/\(.*\)\.[^.]*$/\1/
s/.*/&\.'"${ext}"'"/e' <<< "$1";
done
}
測試,給出文件呸和噓聲,和擴展應該是.file,然後將其改爲.buzz:
mvext file bah boo
mvext buzz b*.file
輸出:
'bah' -> 'bah.file'
'boo' -> 'boo.file'
'bah.file' -> 'bah.buzz'
'boo.file' -> 'boo.buzz'
工作原理:
while
循環會分別解析每個文件的名稱,因爲名稱可能包含轉義空格以及其他內容。如果文件名是某些沒有這樣的空格,那麼可能會避免使用while
循環。sed
讀取標準輸入,由bash
這裏提供字符串<<< "$1"
。sed
代碼改變每個名稱foo.bar(或者甚至只是簡單FOO)爲字符串 「MV -iv foo.bar foo.file」 然後運行與e
計價該字符串命令。 -iv
選項顯示已被移動的內容,並提示是否可能覆蓋現有文件。
如果有的話,sed是爲了改變文件的內容,而不是它們的名字。你可以將它用於後者,但它不是最好的工具。你的sed命令並沒有說sed應該採取什麼行動,我認爲你的腳本只是掛在那一行上,對吧? –
是的,當我問這個問題時,我在sed命令後忘了$ 1。但它無法正常工作。 –
是的,因爲該命令會更改文件的*內容*,而不是它們的名稱。 –