mv, renombrar si existe

26

Necesito ensamblar muchas imágenes en un directorio. Muchas de esas imágenes tienen los mismos nombres de archivo.

¿Existe alguna versión segura de mveso que automáticamente cambie el nombre de los archivos si el nombre de archivo de destino ya existe para que se pic1.jpegconvierta en algo así pic1_2.jpeg?

Podría escribir mi propio script de Python, pero tiene que haber algo como esto para poder hacer:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
el duque
fuente

Respuestas:

38

mv ya admite esto de forma inmediata (al menos en Debian):

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

Como se ve en la página de manual de 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.

Para hacer --backup=tsignifica "hacer copias de seguridad numeradas", invoque de la siguiente manera:

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

(dest_file puede ser, por supuesto, un directorio).

Editar: en versiones posteriores (al menos GNU coreutils 8.22 pero prolly ya mucho antes) simplemente puede escribir

mv --backup=numbered <source_file> <dest_file>
MasterM
fuente
1
+1 para una solución increíblemente limpia. Por cierto, la opción también está presente en RHEL 6.
Paweł Brodacki
Si bien es una buena funcionalidad, esto realmente no ayuda mucho en mi caso, ya que agregará el sufijo después de la extensión, por lo que los archivos terminarán con nombres como .jpg ~ 1 ~ mientras que necesitaría que se llamaran _1.jpg. Probablemente usaré mmv para cambiar el nombre de los archivos después de moverlos.
theduke
44
este es el comando MMV que permitirá alcanzar el resultado deseado después de hacer mv = --backup numerada: MMV -v " "# 1_ # 3. # 2" ~ * ~."
theduke
En mi sistema Debian (mmv 1.01b-18), el comando mmv correcto es:mmv -v "*.*~*~" "#1_#3.#2"
Xavier