2017-06-18 201 views
2

如果參數是文件,我想將其擴展名更改爲.file使用sed更改文件擴展名

這就是我的了:

#!/bin/bash 

while [ $# -gt 0 ] 
do 
    if [ -f $1 ] 
    then 
     sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1 

    fi 
    shift 
done 

腳本運行,但它不會做任何事情。另一個問題是該文件沒有任何擴展名,我的sed命令不起作用,對吧?請幫忙。

+0

如果有的話,sed是爲了改變文件的內容,而不是它們的名字。你可以將它用於後者,但它不是最好的工具。你的sed命令並沒有說sed應該採取什麼行動,我認爲你的腳本只是掛在那一行上,對吧? –

+0

是的,當我問這個問題時,我在sed命令後忘了$ 1。但它無法正常工作。 –

+0

是的,因爲該命令會更改文件的*內容*,而不是它們的名稱。 –

回答

2

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

+0

文件的擴展名沒有給出。它可以是.txt或.file或任何東西。我希望腳本不關心這一點。 –

+0

這並不是什麼大不了的事,你可以在選項3中使用'「*。*」''''''''''''''''''''''來獲得任何擴展名的文件名。 –

+0

Ty,man。它正在工作。你能告訴我,請問%和{}做什麼?這是我第一次使用它們。 –

0

使用殼功能包一個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' 

工作原理:

  1. 的第一個參數是文件擴展名,它存儲在$ ext
  2. while循環會分別解析每個文件的名稱,因爲名稱可能包含轉義空格以及其他內容。如果文件名是某些沒有這樣的空格,那麼可能會避免使用while循環。
  3. sed讀取標準輸入,由bash這裏提供字符串<<< "$1"
  4. sed代碼改變每個名稱foo.bar(或者甚至只是簡單FOO)爲字符串 「MV -iv foo.bar foo.file」 然後運行與e計價該字符串命令。 -iv選項顯示已被移動的內容,並提示是否可能覆蓋現有文件。