Bash脚本在Find命令上循环:输出有空格
我有下面的代码,它试图找到与某些模式匹配的所有文件,并将它们复制到一个新目录,如果文件已经存在,则添加一个后缀。这是因为重复的文件名出现在原始列表中,因为它们位于不同的目录中 除包含Bash脚本在Find命令上循环:输出有空格,bash,find,spaces,Bash,Find,Spaces,我有下面的代码,它试图找到与某些模式匹配的所有文件,并将它们复制到一个新目录,如果文件已经存在,则添加一个后缀。这是因为重复的文件名出现在原始列表中,因为它们位于不同的目录中 除包含空格的fot文件名外,它按预期工作,for in-loop将其作为分隔符 这段代码来自stackoverflow的各个部分,我已经使用过,但我并不完全理解 我尝试过引用文件名的各种组合,以至于我只复制带有空格的文件 有人能建议我如何解决这个问题吗 patterns=( "wom*.gif" "StarB*.gif"
空格的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
你做得有点好
对于“${pattern[@]}”中的模式
工作正常,空格保留在模式
变量中
用于$中的fname(查找$源-名称$模式)代码>已损坏。
请记住,模式
包含空格。
将其固定到:
for fname in $(find "$source" -name "$pattern");
在后续语句中添加引号作为练习;-)我使用@ORMAJ使用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 in-loop
拆分的空格字符处创建了多个条目。错误。不能以这种方式迭代文件名。至少您已经帮助提高了脚本在遇到问题之前不失败的几率。@mcl请参阅关于练习的新增行;-)@Ormaj我阅读了您的参考资料,并试图实现不读取for的行
,但我显然弄错了,因为在搜索匹配的文件后,我遇到了一个不明确的重定向错误。当IFS=read-r aline时,我尝试了;做回显“$aline”;完成<$(查找“/Volumes/Public/media_pics”-name“*.gif”)
@mcl是否需要进程替换