2014-03-26 48 views
1

在發佈這個問題的過程中,我一直在試驗我的代碼,我提出了一些可行的方法,但我不安的智慧想成爲一個更好的程序員,而不是隻是解決手頭的問題,所以我發佈腳本1.0和腳本1.1來問社區,爲什麼第3行的更改使其工作?prepend文件名,而不是目的地路徑,使用mv

我從服務器複製文件並重命名它們。複製進行得很好;重命名不是。這些文件名有空格。 cp勝任處理; mv似乎引發錯誤。我期望在變量名周圍放置""來解決問題,但它仍然給出錯誤:mv: rename /src/foo.wav to zzz - /dest/foo.wav - copied 201403261800.wav: No such file or directory。我試圖在文件名前添加「zzz」,但它已經被預置到了目標路徑。這裏的腳本1.0:

cd /src/ 
DATE=$(date +"%Y%m%d%H%M") 
find . -type f -iname "*.wav" | while read file ; do 
    if [[ "$file" != *zzz* ]]; then 
     echo "Tranferring..."; 
     cp "$file" /dest/ 
     mv "$file" \zzz\ \-\ "$file"\ \-\ copied\ $DATE.wav 
     echo "Transfer complete."; 
    fi 
done 

(該if條件確保我不會再複製任何東西我以前複製和重命名。)

更換3號線也可以正常工作。但爲什麼?這裏的腳本1.1:

cd /src/ 
DATE=$(date +"%Y%m%d%H%M") 
find *.* -iname "*.wav" | while read file ; do 
    if [[ "$file" != *zzz* ]]; then 
     echo "Tranferring..."; 
     cp "$file" /dest/ 
     mv "$file" \zzz\ \-\ "$file"\ \-\ copied\ $DATE.wav 
     echo "Transfer complete."; 
    fi 
done 

回答

2

如果你看看在不同find命令的輸出,你會看到find . -type f將返回這樣的行:./passwd。 現在你不能使用它作爲目標,因爲重命名爲./passwdzzz - ./passwd會嘗試將其移動到zzz - .文件夾中作爲passwd

順便說一句,你可以圍繞整個目標名稱加上引號,使它看起來更好(你也不能逃脫第一Z反正):

mv "$file" "zzz - $file - copied $DATE.wav" 

而且你可能想擺脫在文件的中間部分的.wav:

mv "$file" "zzz - ${file%.wav} - copied $DATE.wav" 

${var%string}返回用繩子$ VAR值,如果從目前的它端排出。你可以找到更多關於這個尋找bash字符串操作的信息。

+0

這超出了我的問題的範圍,這真的幫助了我。我只是測試了這一切,它都運行得很好。謝謝。 – Crowder

相關問題