[英]Bash Script looping on Find Command: output has spaces
我有以下代碼嘗試查找與某些模式匹配的所有文件,並將它們復制到新目錄,如果文件已存在,則添加后綴。 這是因為重復的文件名出現在原始列表中-因為它們在不同的目錄中找到。
它可以按預期工作,除了fot文件名包含for in loop
中用作分隔符的spaces
。
這段代碼來自我使用過的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
好吧,我使用@ormaaj的使用while循環進行讀取的想法來使其工作。 我還沒有弄清楚它的作用,但是現在我已經復制了所有文件,這就是我想要的。
我確信它仍然是“脆弱的”,任何建議都將不勝感激。
我不使用-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
您做的部分不錯。
for pattern in "${pattern[@]}"
中的pattern
,效果很好,將空格保留到pattern
變量中。
for fname in $(find $source -name $pattern);
被打破。
請記住, pattern
包含一個空格。
修正為:
for fname in $(find "$source" -name "$pattern");
在后面的語句中加引號是一個練習;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.