mv, zmień nazwę, jeśli istnieje

26

Muszę zebrać wiele obrazów w jednym katalogu. Wiele z tych obrazów ma te same nazwy plików.

Czy istnieje bezpieczna wersja tego mv, która automatycznie zmienia nazwy plików, jeśli docelowa nazwa pliku już istnieje, więc pic1.jpegstaje się coś podobnego pic1_2.jpeg?

Mógłbym napisać własny skrypt Pythona, ale musi być coś takiego, aby móc:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
książę
źródło

Odpowiedzi:

38

mv już obsługuje to po wyjęciu z pudełka (przynajmniej w Debianie):

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

Jak widać na stronie podręcznika 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.

Aby --backup=toznaczać „tworzenie numerowanych kopii zapasowych”, wywołaj w następujący sposób:

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

(dest_file może oczywiście być katalogiem).

Edycja: w późniejszych wersjach (przynajmniej GNU coreutils 8.22, ale już znacznie wcześniej), możesz po prostu pisać

mv --backup=numbered <source_file> <dest_file>
MasterM
źródło
1
+1 za niezwykle czyste rozwiązanie. BTW, opcja jest również obecna na RHEL 6.
Paweł Brodacki
Chociaż jest to niezła funkcjonalność, w moim przypadku tak naprawdę to nie pomaga, ponieważ po rozszerzeniu dołącza sufiks, więc pliki będą mieć nazwy takie jak .jpg ~ 1 ~, podczas gdy będę potrzebować ich nazwy _1.jpg. Prawdopodobnie użyję mmv do zmiany nazw plików po ich przeniesieniu.
książę
4
Jest to polecenie MMV że będzie osiągnąć mój pożądany rezultat po wykonaniu mv --backup = numerach: MMV -v " "# 1_ # 3. # 2" ~ * ~."
theduke
W moim systemie Debian (mmv 1.01b-18) poprawną komendą mmv jest:mmv -v "*.*~*~" "#1_#3.#2"
Xavier