GNU/Linux >> Belajar Linux >  >> Linux

Menyalin semua file di dalam subdirektori dan mengganti nama alih-alih menimpa

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 atau SIMPLE_BACKUP_SUFFIX . Metode kontrol versi dapat dipilih melalui --backup pilihan atau melalui VERSION_CONTROL variabel lingkungan. Berikut nilainya:

  • none , off :jangan pernah membuat cadangan (meskipun --backup diberikan)
  • numbered , t :buat cadangan bernomor
  • existing , nil :bernomor jika cadangan bernomor ada, sederhana jika tidak
  • simple , 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;-)


Linux
  1. Batch mengganti nama file di baris perintah dan Xargs

  2. Temukan semua file nol-byte di direktori dan subdirektori

  3. Bagaimana cara mengambil string dalam direktori dan semua subdirektorinya?

  1. Cara Menghitung Jumlah File dan Subdirektori di dalam Direktori yang Diberikan

  2. Perintah untuk membuat daftar semua file kecuali . (titik) dan .. (titik titik)

  3. Menyalin pengguna dan kata sandi Linux ke server baru

  1. Cara Menemukan Jumlah File dalam Direktori dan Subdirektori

  2. Ganti Nama Semua File dan Nama Direktori menjadi Huruf Kecil di Linux

  3. Shell Script:Menyortir File Ke Direktori Dan Subdirektori?