[英]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.