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 suffix
Akhiran cadangan adalah
~
, kecuali disetel dengan--suffix
atauSIMPLE_BACKUP_SUFFIX
. Metode kontrol versi dapat dipilih melalui--backup
pilihan atau melaluiVERSION_CONTROL
variabel lingkungan. Berikut nilainya:
none
,off
:jangan pernah membuat cadangan (meskipun--backup
diberikan)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;-)