請注意,由於您的文件名包含空格(或者至少有趣的文件名),因此您應該在mv
命令中使用"$i"
左右的雙引號,並在echo
中使用雙引號。如果在文件名中只有單個空格且沒有製表符或換行符,則'在回顯中脫離它',但如果不用雙引號括起來並且它包含兩個相鄰空格,則會銷燬文件名,或前導空格或尾隨空格,或...通常,使用$(...)
而不是後引號。
通過給出幾個(一個或兩個)樣本輸入文件名以及預期的相應輸出文件名,可以改進您的問題。我們可以告訴的是,當使用空格分隔時(幾乎看起來不需要-F" "
),文件名至少有5個部分,其中只有第一個,第三個和第五個要保留。假設您在輸出中生成反斜槓以保留名稱中的空格,而不是因爲您認爲文件名中的反斜槓是個好主意。 (也就是說,反斜槓不會出現在磁盤上的名稱)
既然你周圍有一個循環,我會用awk
做到這一點的方法是:
for file in *
do
name=$(echo "$file" | awk '{print $1 " - S0" $3 "E" $5 ".avi"}')
mv "$file" "$name"
done
有固體這樣做的理由。該作業保留了awk
輸出中的空格等(切斷尾隨的換行符,但僅此而已)。然後mv
命令行是微不足道的,使用雙引號來防止問題。
嘗試:
for file in *
do
mv "$file" $(echo "$file" | awk '{print $1 " - S0" $3 "E" $5 ".avi"}')
done
讓你陷入麻煩的管道輸出由外殼和拆分重新掃描,你必須防止分裂(因此在原代碼中的反斜槓),並擔心其他shell元字符(例如,如果某個節目的名稱中有撇號)。
但是,您可以用雙引號將整個$(...)
括起來,然後事情就會奏效 - 我會說'如預期的那樣',但實際上並不如我預期的那樣。但隨着雙方bash
和ksh
測試表明,這個工程:
for file in *
do
mv "$file" "$(echo "$file" | awk '{print $1 " - S0" $3 "E" $5 ".avi"}')"
done
外雙引號只是防止shell擴展$(...)
的輸出,並採用$(...)
大大簡化生活。用簡單的引號代替$(...)
會產生各種各樣的問題;在反引號裏面,你必須逃避各種各樣的事情。但似乎在$(...)
記號暫停當前雙引號字符串搜索,並開始搜索關閉)
與'正常'解釋中間的東西,這給出了所需的結果。
我覺得雙線(賦值加使用)比較容易理解,但是這個版本在雙引號內用複雜的命令替換也可以。
下面是一些測試代碼,假設你目前沒有一個在當前目錄中名爲spaced-out
目錄(和你有在當前目錄寫權限):
mkdir spaced-out
(
cd spaced-out
# Create files with spaces in the names
for file in "part1 x part2 y part3" "show1 a show2 b show3" \
" leader1 x leader2 y leader3 "
do
echo hello world > "$file"
done
ls
ls -l
# Rename the files
for file in *
do
mv "$file" "$(echo "$file" | awk '{print $1 " - S0" $3 "E" $5 ".avi"}')"
done
# Show results and clean up
ls -l
rm -f *
)
rmdir spaced-out
當運行作爲腳本(bash rename.script
),它生成:
leader1 x leader2 y leader3 part1 x part2 y part3 show1 a show2 b show3
total 24
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:02 leader1 x leader2 y leader3
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:02 part1 x part2 y part3
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:02 show1 a show2 b show3
total 24
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:02 leader1 - S0leader2Eleader3.avi
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:02 part1 - S0part2Epart3.avi
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:02 show1 - S0show2Eshow3.avi
當作爲bash -x rename.script
運行時,它產生:
+ mkdir spaced-out
+ cd spaced-out
+ for file in '"part1 x part2 y part3"' '"show1 a show2 b show3"' '" leader1 x leader2 y leader3 "'
+ echo hello world
+ for file in '"part1 x part2 y part3"' '"show1 a show2 b show3"' '" leader1 x leader2 y leader3 "'
+ echo hello world
+ for file in '"part1 x part2 y part3"' '"show1 a show2 b show3"' '" leader1 x leader2 y leader3 "'
+ echo hello world
+ ls
leader1 x leader2 y leader3 part1 x part2 y part3 show1 a show2 b show3
+ ls -l
total 24
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:03 leader1 x leader2 y leader3
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:03 part1 x part2 y part3
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:03 show1 a show2 b show3
+ for file in '*'
++ echo ' leader1 x leader2 y leader3 '
++ awk '{print $1 " - S0" $3 "E" $5 ".avi"}'
+ mv ' leader1 x leader2 y leader3 ' 'leader1 - S0leader2Eleader3.avi'
+ for file in '*'
++ echo 'part1 x part2 y part3'
++ awk '{print $1 " - S0" $3 "E" $5 ".avi"}'
+ mv 'part1 x part2 y part3' 'part1 - S0part2Epart3.avi'
+ for file in '*'
++ echo 'show1 a show2 b show3'
++ awk '{print $1 " - S0" $3 "E" $5 ".avi"}'
+ mv 'show1 a show2 b show3' 'show1 - S0show2Eshow3.avi'
+ ls -l
total 24
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:03 leader1 - S0leader2Eleader3.avi
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:03 part1 - S0part2Epart3.avi
-rw-r--r-- 1 jleffler eng 12 Jul 6 08:03 show1 - S0show2Eshow3.avi
+ rm -f 'leader1 - S0leader2Eleader3.avi' 'part1 - S0part2Epart3.avi' 'show1 - S0show2Eshow3.avi'
+ rmdir spaced-out
對於聲稱使用包含空格的文件名稱的腳本,雙倍空間文件名(可選地帶有前導空格和/或尾隨空格)通常是非常好的測試。此代碼不管理包含換行符的文件名; awk
腳本將這個名稱視爲兩行輸入,這不是我們想要的。它可以是固定的;它通常不值得麻煩,除非你需要你的腳本絕對是防彈的(例如,因爲它將發送給客戶 - 客戶做了最不可思議的事情,並且文件中帶有換行符的名稱完全在他們的能力範圍內,儘管你永遠不會自己做)。
可能的重複[如何使用與空白的目錄上查找?](http://stackoverflow.com/questions/6052325/how-to-use-find-on-dirs-with-white-spaces) – hek2mgl
請注意,因爲你的文件名包含空格(或者至少有趣的是),所以你應該在''mv'命令'和'echo'的''$ i'''周圍使用雙引號。如果文件名中只有單個空格且沒有製表符或換行符,那麼您可以在'echo'中跳過它,但是如果不將它放在雙引號中並且它包含兩個相鄰的文件名空格或前導空格或尾隨空格,或...通常,使用'$(...)'而不是反引號。 –
通過給出幾個(一個或兩個)樣本輸入文件名稱以及預期的相應輸出文件名稱,可以改進您的問題。我們可以告訴的是,當使用空格進行分割時('-F「」似乎不是必需的),至少有5個部分是文件名,其中只有第一個,第三個和第五個要保留。假設您在輸出中生成反斜槓以保留名稱中的空格,而不是因爲您認爲輸出中的反斜槓是好的。 –