
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 bash
bucle.
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 cp
y mv
admiten esta funcionalidad a través de la --backup
opció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, cd
a la carpeta principal de su colección de MP3 (carpeta principal de artist1
).
Ahora, si ejecuta el siguiente find
comando, 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
find
recopila todas las rutas a los archivos MP3, por ejemplo,./artist two/album one/Track1.mp3
y las pasa abash
través de-exec
$(echo "$1" | sed "s/\.\///" | tr " /" "-")
se utiliza para modificar el nombre del archivo de salida.sed
elimina el primero./
ytr
convierte todos los caracteres de espacio y/
a-
.
Es esencial que ejecute find
como .
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 echo
y 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'