mv, renommer s'il existe

26

J'ai besoin de rassembler beaucoup d'images dans un seul répertoire. Beaucoup de ces images ont les mêmes noms de fichiers.

Existe-t-il une version sûre mvqui renommera automatiquement les fichiers si le nom de fichier cible existe déjà de sorte que cela pic1.jpegressemble à quelque chose pic1_2.jpeg?

Je pourrais écrire mon propre script python mais il doit y avoir quelque chose comme ça pour que je puisse faire:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
le duc
la source

Réponses:

38

mv prend déjà cela en charge (au moins dans Debian):

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

Comme vu dans la page de manuel 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.

Pour faire --backup=tsignifie "faire des sauvegardes numérotées", appelez comme suit:

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

(dest_file peut bien sûr être un répertoire).

Edit: dans les versions ultérieures (au moins GNU coreutils 8.22 mais prolly déjà beaucoup plus tôt), vous pouvez simplement écrire

mv --backup=numbered <source_file> <dest_file>
MasterM
la source
1
+1 pour une solution incroyablement propre. BTW l'option est également présente sur RHEL 6.
Paweł Brodacki
Bien que ce soit une fonctionnalité intéressante, cela n'aide pas vraiment dans mon cas car il ajoutera le suffixe après l'extension, donc les fichiers se retrouveront avec des noms comme .jpg ~ 1 ~ alors que j'aurais besoin qu'ils soient nommés _1.jpg. J'utiliserai probablement mmv pour renommer les fichiers après les avoir déplacés.
2011
4
c'est la commande MMV qui permettra d' atteindre mon résultat souhaité après avoir fait mv = --backup numérotée: MMV -v " "# 1_ # 3. # 2" ~ * ~."
theduke
Sur mon système Debian (mmv 1.01b-18), la commande mmv correcte est:mmv -v "*.*~*~" "#1_#3.#2"
Xavier