GNU cp(1) バックアップ オプションがあります:
cp --backup SOURCE [SOURCE...] [DESTINATION]
cp(1) のマニュアルページで説明されているように、他のオプションで制御できる次の効果があります。 :
--backup[=CONTROL] make a backup of each existing destination file -b like --backup but does not accept an argument -S, --suffix=SUFFIX override the usual backup suffixバックアップサフィックスは
~です 、--suffixで設定されていない限り またはSIMPLE_BACKUP_SUFFIX.バージョン管理方法は--backupで選択できます オプションまたはVERSION_CONTROLを介して 環境変数。値は次のとおりです:
none、off:バックアップを作成しない (たとえ--backupであっても) 与えられます)numbered、t:番号付きバックアップを作成existing、nil:番号付きバックアップが存在する場合は番号付き、そうでない場合はシンプルsimple、never:常に簡単なバックアップを作成
例
cp --backup=existing --suffix=.orig ~/Music/* ~/Videos
これにより、~/Music のすべてのファイルがコピーされます ~/Videos へ .移動先に同名のファイルが存在する場合は .orig を追加してリネーム バックアップとしてその名前に。バックアップと同じ名前のファイルが存在する場合、代わりに .1 を追加してバックアップの名前を変更します そして、それも存在する場合は .2 など。その後、ソース ファイルが宛先にコピーされます。
サブディレクトリ内のファイルを再帰的にコピーする場合は、-R を使用します :
cp -R --backup=existing --suffix=.orig ~/Music ~/Videos
あなたの問題は、実際に cp を見つけることです ターゲット ファイルが既に存在する場合、別の名前でターゲット ファイルを作成するバリアント。そのためのツールは知りませんが、自分で実装するのは難しくありません:
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"
このスクリプトは cp を呼び出します 失敗した場合に備えて、チェックサムをファイル名に追加します。欠点:同じ名前の 3 番目のファイルが表示されると、2 番目のファイルが同一であれば上書きされます .
上記のスクリプトが saveCopy と呼ばれるとします。 親作業ディレクトリに保存すると、次のように動作します:
$ find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;
./a/z1.jpg -> /tmp/Extracted/z1.jpg
./a/z2.jpg -> /tmp/Extracted/z2.jpg
./a/z3.jpg -> /tmp/Extracted/z3.jpg
/tmp/Extracted/z3.jpg not overwritten
./b/z3.jpg -> /tmp/Extracted//z3.jpg~d41d8cd98f00b204e9800998ecf8427e
./b/z4.jpg -> /tmp/Extracted/z4.jpg
スクリプトは単一の入力ファイルに対してのみ機能し、ターゲットがディレクトリの場合にのみ機能することに注意してください!確かに改善できます;-)