cp/rsync - 小さい場合は上書き、元のファイルのバックアップ、大きい場合は上書き

cp/rsync - 小さい場合は上書き、元のファイルのバックアップ、大きい場合は上書き

フォルダAにはいくつかのファイルがありますが、このファイルをフォルダBにコピーしたいと思います。フォルダBには、同じ名前のいくつかのファイルが含まれています。

すべてのファイルのタイムスタンプは同じで、より大きなファイルを同じ名前で上書きしてバックアップし、同時に同じ名前の小さいターゲットファイルを上書きしてバックアップしないようにします。

cpこれはSimpleまたはrsync

ありがとうございます!

ベストアンサー1

同じサイズのファイルをどのように処理するかは言っていませんでした。また、「A」または「B」ディレクトリのファイルを上書きするかどうかは明らかではありませんでした。

rsyncまたはcpのみを使用してこれを実行できるかどうかわかりません。この例では、「/tmp/A」はソースディレクトリ、「/tmp/B」は宛先ディレクトリ、「/tmp/C」はバックアップ先ディレクトリです。

「B」の大きなファイルをバックアップして上書きします。小さいファイルを上書きし、同じサイズのファイルに対して何もしません。

# get the size and filnames of files in '/tmp/A' directory and loop through each file found
ls /tmp/A | while read filename
do
  # get the size of file in 'A' directory
  sizeA=$( ls -l "/tmp/A/${filename}" | awk '{print $5}')

  # get the size of corresponding file in 'B' directory
  sizeB=$(ls -l "/tmp/B/${filename}" | awk '{print $5}')

  # compare file sizes and perform appropriate action
  if [ ${sizeB} -gt ${sizeA} ]
  then
    echo "file in B named \"${filename}\" is larger than A file"

    # Backup and overwrite the file
    cp "/tmp/B/${filename}" /tmp/C/
    cp -f "/tmp/A/${filename}" /tmp/B/

  else
    if [ ${sizeB} -lt ${sizeA} ]
    then
       echo "file in B named \"${filename}\" is smaller than A file"
       # overwrite the file
       cp -f "/tmp/A/${filename}" /tmp/B/
    else
       echo "The files \"${filename}\" are the same size"
    fi
  fi
done

非常に限られたテストを行いましたが、うまくいくようです。慎重にテストし、必要に応じて修正してください。

おすすめ記事