2013-03-07 128 views
0

我有下面的代碼,它試圖找到匹配某些模式的所有文件,並將它們複製到一個新目錄,如果文件已經存在,則添加一個後綴。這是因爲重複的文件名出現在原始列表中 - 因爲它們可以在不同的目錄中找到。Bash腳本循環查找命令:輸出有空格

它的工作原理與預期的一樣,只是包含spaces的fot文件名以for in loop作爲分隔符。

此代碼來自stackoverflow的各個部分,我已經使用過這些代碼,但我並沒有完全理解。

我已經嘗試過引用文件名的各種組合,只是我用空格複製文件。

能有人建議,我怎麼能解決這個問題

patterns=("wom*.gif" "StarB*.gif" "logos*.gif") 
for pattern in "${patterns[@]}" 
do 
    for fname in $(find $source -name $pattern); 
    do 
    echo Path-and-Filename: $fname 
    filename=$(basename "$fname") 
    extension=${filename##*.} 
    filename=${filename%.*} 
    echo Just-Filename: $filename.$extension 
    suffix="" 
    count=0 
    while [ -f $dest$filename$suffix.$extension ] 
    do 
     count=$(($count+1)) 
     suffix="("$count")" 
    done 

    cp -v -p "$fname" $dest"$filename"$suffix.$extension >>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log 2>>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log 
    done 
done 

回答

0

你已經在部分好的完成。

for pattern in "${pattern[@]}"工作正常,空格被保存到pattern變量。

for fname in $(find $source -name $pattern);已損壞。
請記住pattern包含一個空格。
解決它:

for fname in $(find "$source" -name "$pattern"); 

添加引號來進一步說明留作練習;-)

+0

對不起 - 它沒有出現任何不同,帶空格的文件名在空格字符的'for in loop'中創建了多個條目。 – mcl 2013-03-07 11:51:50

+0

錯誤。你不能以這種方式迭代文件名。至少你已經幫助提高了可能性,在解決問題之前腳本不會失敗。 – ormaaj 2013-03-07 11:56:29

+0

@mcl看到關於練習的附加行;-) – 2013-03-07 12:00:40

1

嗯,我得到它的工作,通過使用while循環@ ormaaj的想法讀。我沒有做出正確的解決方案,但我現在已經複製了所有的文件,而這正是我想要的。

我相信它仍然'脆弱',任何意見將不勝感激。

我沒有使用-print0,因爲我不知道如何讀取輸出的行,它顯示爲一個長行。我假設我需要爲每個文件名設置分隔符,但無法弄清楚。現在大腦非常緩慢。

patterns=("*.gif" "*.GIF" "*.tif" "*.TIF" "*.jpg" "*.JPG" "*.png" "*.PNG") 
for pattern in "${patterns[@]}" 
do 
    find "/Volumes/Public/media_pics" -name "$pattern" | while IFS= read -r fname; 
    do 
     echo Full-Filename: "$fname" 
     filename=$(basename "$fname") 
     extension=${filename##*.} 
     filename=${filename%.*} 
     echo Just-Filename: $filename.$extension 
     suffix="" 
     count=0 
     while [ -f $dest$filename$suffix.$extension ] 
     do 
     count=$(($count+1)) 
     suffix="("$count")" 
     done 

     cp -v -p "$fname" "$dest$filename$suffix.$extension" >>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log 2>>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log 
    done 
done