0

次のコードは、特定のパターンに一致するすべてのファイルを検索して新しいディレクトリにコピーし、ファイルがすでに存在する場合はサフィックスを追加しようとします。これは、重複するファイル名が元のリストに表示されるためです。これらは別のディレクトリにあるためです。

区切り文字として取るファイル名を除いて、期待どおりに機能しますspacesfor in loop

このコードは、私が使用したスタックオーバーフローのさまざまな部分からのものであり、完全には理解していません。

スペースを含むファイルのみをコピーする範囲で、ファイル名を引用するさまざまな組み合わせを試しました。

誰かがこの問題を解決する方法についてアドバイスできますか

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 を使用しませんでした。1 つの長い行として表示されました。ファイル名ごとに区切り文字を設定する必要があると思いますが、わかりませんでした。今日、脳は非常に遅いです。

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 に答える