Linux: mover archivos de diferentes directorios con el mismo nombre a uno mientras se les cambia el nombre

Linux: mover archivos de diferentes directorios con el mismo nombre a uno mientras se les cambia el nombre

Ripeé por lotes mis CD antiguos a Track1.mp3. El problema es que cada directorio de CD tiene Track1.mp3, por lo que cuando los muevo a/Música, ¡se sobrescriben!

¿Existe posiblemente un script bash o un comando mv paramover.mp3 de varios subdirectorios con el mismo nombre de archivo en un solo directorio mientras se les cambia el nombre si ese nombre ya existe en LINUX.

Respuesta1

Lo más probable es que desee cambios de nombre "amigables". Supongamos que tienes una estructura como

Artist1-+
        +-AlbumA-+
        |        +-Track1.mp3
        |        +-Track2.mp3
        +-AlbumB-+
                 +-Track1.mp3
                 +-Track2.mp3
Artist2-+
        +-AlbumX-+
        |        +-Track1.mp3
        |        +-Track2.mp3
        +-AlbumY-+
        |        +-Track1.mp3
        |        +-Track2.mp3

Ahora querrás que el directorio único contenga algo como

Artist1-AlbumA-Track1.mp3
Artist1-AlbumA-Track2.mp3
...
Artist2-AlbumY-Track1.mp3
Artist2-AlbumY-Track2.mp3

Esto se puede lograr con un simple bashbucle.

for M in */*/*.mp3; do
  TRACK=$(basename "$M")
  ALBUM=$(basename $(dirname "$M"))
  ARTIST=$(basename $(dirname $(dirname "$M")))
  mv "$M" "$TARGET_DIR/$ARTIST-$ALBUM-$TRACK"
done

Respuesta2

Los comandos cpy mvadmiten esta funcionalidad a través de la --backupopción.

Desde elmanual:

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

   -b     like --backup but does not accept an argument

[...]

El sufijo de la copia de seguridad es '~', a menos que se establezca con --suffix o SIMPLE_BACKUP_SUFFIX. El método de control de versiones se puede seleccionar mediante la opción --backup o mediante la variable de entorno VERSION_CONTROL. Aquí están los valores:

   none, off
          never make backups (even if --backup is given)

   numbered, t
          make numbered backups

   existing, nil
          numbered if numbered backups exist, simple otherwise

   simple, never
          always make simple backups

Entonces, por ejemplo, mv --backup=t <source_file> <dest_file>debería funcionar.

Respuesta3

Según la comunidad de Linux y commandlinefu.com, esta práctica característica no es posible en ninguna versión hasta la fecha.

Actualmente no existe ningún comando ni una forma segura a través de la línea de comandos para mover archivos de varios directorios y subdirectorios que tienen el mismo nombre a un solo directorio sin sobrescribirlos.

Fuentes: commandlinefu.com, Askubuntu.com, linuxquestions.org, superuser.com

Respuesta4

Supongo que tienes una estructura de carpetas como esta:

$ tree .
.
├── artist1
│   ├── albuma
│   │   └── Track1.mp3
│   └── albumb
│       └── Track1.mp3
└── artist two
    ├── album one
    │   └── Track1.mp3
    └── album two
        └── Track1.mp3

Primero, cda la carpeta principal de su colección de MP3 (carpeta principal de artist1).

Ahora, si ejecuta el siguiente findcomando, verá un resultado como este:

$ find . -name '*.mp3' -exec bash -c 'echo mv -v "$1" /tmp/music/$(echo "$1" | sed "s/\.\///" | tr " /" "-")' bash {} \;
mv -v ./artist two/album one/Track1.mp3 /tmp/music/artist-two-album-one-Track1.mp3
mv -v ./artist two/album two/Track1.mp3 /tmp/music/artist-two-album-two-Track1.mp3
mv -v ./artist1/albuma/Track1.mp3 /tmp/music/artist1-albuma-Track1.mp3
mv -v ./artist1/albumb/Track1.mp3 /tmp/music/artist1-albumb-Track1.mp3
  • findrecopila todas las rutas a los archivos MP3, por ejemplo, ./artist two/album one/Track1.mp3y las pasa a bashtravés de-exec
  • $(echo "$1" | sed "s/\.\///" | tr " /" "-")se utiliza para modificar el nombre del archivo de salida. sedelimina el primero ./y trconvierte todos los caracteres de espacio y /a -.

Es esencial que ejecute findcomo .directorio de inicio; de lo contrario, la ruta de salida (relativa) no se modificará correctamente. Cambie /tmp/music/a la ruta de su biblioteca de música.

Si el resultado le parece bien, elimine el primero echoy ejecute el comando nuevamente.

Producción:

$ find . -name '*.mp3' -exec bash -c 'mv -v "$1" /tmp/music/$(echo "$1" | sed "s/\.\///" | tr " /" "-")' babbsh {} \;
'./artist two/album one/Track1.mp3' -> '/tmp/music/artist-two-album-one-Track1.mp3'
'./artist two/album two/Track1.mp3' -> '/tmp/music/artist-two-album-two-Track1.mp3'
'./artist1/albuma/Track1.mp3' -> '/tmp/music/artist1-albuma-Track1.mp3'
'./artist1/albumb/Track1.mp3' -> '/tmp/music/artist1-albumb-Track1.mp3'

información relacionada