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
スクリプトは単一の入力ファイルに対してのみ機能し、ターゲットがディレクトリの場合にのみ機能することに注意してください!確かに改善できます;-)