mv, umbenennen, falls vorhanden

26

Ich muss viele Bilder in einem Verzeichnis zusammenstellen. Viele dieser Bilder haben den gleichen Dateinamen.

Gibt es eine sichere Version, mit der mvDateien automatisch umbenannt werden, wenn der Zieldateiname bereits vorhanden ist, sodass er ungefähr so pic1.jpegaussieht pic1_2.jpeg?

Ich könnte mein eigenes Python-Skript schreiben, aber da draußen muss es so etwas geben, damit ich Folgendes tun kann:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
der Herzog
quelle

Antworten:

38

mv unterstützt dies bereits von Anfang an (zumindest in Debian):

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

Wie in der Manpage von mv (1) zu sehen:

--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.

Um --backup=t"nummerierte Backups" zu erstellen, rufen Sie Folgendes auf:

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

(dest_file kann natürlich ein Verzeichnis sein).

Edit: In späteren Versionen (mindestens GNU Coreutils 8.22 aber schon viel früher) kann man einfach schreiben

mv --backup=numbered <source_file> <dest_file>
MasterM
quelle
1
+1 für eine erstaunlich saubere Lösung. Übrigens ist die Option auch auf RHEL 6 verfügbar.
Paweł Brodacki
Obwohl dies eine nette Funktion ist, hilft es in meinem Fall nicht viel, da das Suffix nach der Erweiterung angehängt wird, so dass die Dateien Namen wie .jpg ~ 1 ~ haben, während ich sie als _1.jpg bezeichnen müsste. Ich werde wahrscheinlich mmv verwenden, um die Dateien nach dem Verschieben umzubenennen.
Donnerstag,
4
dies ist der mmv Befehl, mein gewünschtes Ergebnis nach tun mv --backup = nummerierte erreichen: mmv -v " "# 1_ # 3 # 2" ~ * ~."
TheDuke
Auf meinem Debian-System (mmv 1.01b-18) lautet der korrekte mmv-Befehl:mmv -v "*.*~*~" "#1_#3.#2"
Xavier