0

我有以下代码尝试查找与某些模式匹配的所有文件并将它们复制到新目录,如果文件已存在则添加后缀。这是因为重复的文件名出现在原始列表中 - 因为它们位于不同的目录中。

它按预期工作,除了包含作为分隔符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
4

2 回答 2

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
于 2013-03-07T15:44:33.493 回答
0

你做得很好。

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

for fname in $(find $source -name $pattern);被打破。
请记住,pattern其中包含一个空格。
将其修复为:

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

将引号添加到进一步的语句中作为练习 ;-)

于 2013-03-07T11:43:59.393 回答