我有以下代码尝试查找匹配某些模式的所有文件并将它们复制到新目录,如果该文件已存在则添加后缀。这是因为重复的文件名出现在原始列表中 - 因为它们位于不同的目录中。
除了包含spaces
的文件名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 :(得分:1)
我使用@ 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
答案 1 :(得分:0)
你做得很好。
for pattern in "${pattern[@]}"
工作正常,空格保留为pattern
变量。
for fname in $(find $source -name $pattern);
被打破了。
请记住pattern
包含空格。
修复:
for fname in $(find "$source" -name "$pattern");
在其他语句中添加引号留作练习; - )