GNU cp(1) memiliki opsi cadangan:
cp --backup SOURCE [SOURCE...] [DESTINATION]
Ini memiliki efek berikut yang dapat dikontrol dengan opsi lain seperti yang dijelaskan di halaman manual 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 suffixAkhiran cadangan adalah
~, kecuali disetel dengan--suffixatauSIMPLE_BACKUP_SUFFIX. Metode kontrol versi dapat dipilih melalui--backuppilihan atau melaluiVERSION_CONTROLvariabel lingkungan. Berikut nilainya:
none,off:jangan pernah membuat cadangan (meskipun--backupdiberikan)numbered,t:buat cadangan bernomorexisting,nil:bernomor jika cadangan bernomor ada, sederhana jika tidaksimple,never:selalu buat cadangan sederhana
Contoh
cp --backup=existing --suffix=.orig ~/Music/* ~/Videos
Ini akan menyalin semua file di ~/Music ke ~/Videos . Jika ada file dengan nama yang sama di tempat tujuan, file tersebut diganti namanya dengan menambahkan .orig untuk namanya sebagai cadangan. Jika ada file dengan nama yang sama dengan cadangan, cadangan diganti namanya dengan menambahkan .1 dan, jika ada juga, .2 Dan seterusnya. Baru setelah itu file sumber disalin ke tujuan.
Jika Anda ingin menyalin file di subdirektori secara rekursif, gunakan -R :
cp -R --backup=existing --suffix=.orig ~/Music ~/Videos
Masalah Anda sebenarnya adalah menemukan cp varian yang membuat file target dengan nama berbeda jika sudah ada. Saya tidak mengetahui adanya alat yang dapat melakukannya, namun, tidak sulit untuk menerapkannya sendiri:
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"
Skrip ini memanggil cp lagi jika gagal, menambahkan checksum ke nama file. Cacat:Jika file ketiga dengan nama yang sama muncul, itu akan menimpa file kedua jika identik .
Mengingat bahwa skrip di atas disebut saveCopy dan disimpan di direktori kerja induk, berikut ini berfungsi:
$ 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
Ketahuilah bahwa skrip hanya berfungsi untuk satu file input dan jika targetnya adalah direktori! Itu pasti bisa ditingkatkan;-)