mv, ganti nama jika ada

26

Saya perlu mengumpulkan banyak gambar ke dalam satu direktori. Banyak dari gambar-gambar itu memiliki nama file yang sama.

Apakah ada beberapa versi yang aman mvyang secara otomatis akan mengganti nama file jika nama file target sudah ada sehingga pic1.jpegmenjadi seperti itu pic1_2.jpeg?

Saya bisa menulis skrip python saya sendiri tetapi harus ada sesuatu seperti ini di luar sana sehingga saya bisa melakukan

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
thuke
sumber

Jawaban:

38

mv sudah mendukung ini di luar kotak (setidaknya dalam bahasa Debian):

mv --backup=t <source_file> <dest_file>

Seperti yang terlihat di manual mv (1):

--backup[=CONTROL]
         make a backup of each existing destination file

The  backup  suffix  is  `~',  unless  set  with   --suffix   or   SIM‐
PLE_BACKUP_SUFFIX.   The version control method may be selected via the
--backup option or through the  VERSION_CONTROL  environment  variable.

Untuk membuat --backup=trata - rata "buat cadangan bernomor", aktifkan sebagai berikut:

env VERSION_CONTROL=numbered mv --backup=t <source_file> <dest_file>

(dest_file tentu saja bisa menjadi direktori).

Sunting: dalam versi yang lebih baru (setidaknya GNU coreutils 8.22 tetapi sudah jauh lebih awal) Anda cukup menulis

mv --backup=numbered <source_file> <dest_file>
MasterM
sumber
1
+1 untuk solusi luar biasa bersih. BTW opsi hadir di RHEL 6 juga.
Paweł Brodacki
Meskipun fungsionalitasnya bagus, ini tidak terlalu membantu dalam kasus saya karena ini akan menambahkan akhiran setelah ekstensi, sehingga file-file tersebut akan berakhir dengan nama-nama seperti .jpg ~ 1 ~ sementara saya membutuhkannya dengan nama _1.jpg. Saya mungkin akan menggunakan mmv untuk mengganti nama file setelah memindahkannya.
theduke
4
ini adalah perintah mmv yang akan mencapai hasil yang diinginkan saya setelah melakukan mv --backup = bernomor: mmv v " "# 1_ # 3. # 2" ~ * ~."
theduke
Pada sistem Debian saya (mmv 1.01b-18), perintah mmv yang benar adalah:mmv -v "*.*~*~" "#1_#3.#2"
Xavier