eliminar ciertos caracteres especiales de los nombres de archivos

eliminar ciertos caracteres especiales de los nombres de archivos

Tengo problemas para transferir carpetas a mi disco duro externo. No quiero cambiar el formato en el disco duro.

Entonces, hay cientos de archivos en la carpeta y el error que me impide copiarlos proviene de caracteres especiales (no sé exactamente cuáles, pero creo que son "|" y "." y estoy seguro de que hay otros. He estado renombrando/eliminando estos manualmente, pero es una molestia.

Abierto a sugerencias, pero "supongo" que estoy buscando una manera de eliminar esos caracteres específicos del nombre del archivo (¿hacer eso causaría un problema con .m4a, etc.?), o reemplazarlos con un guión bajo si es necesario. La única pista que tengo es el cambio de nombre de Perl, pero aún no lo he probado.

cambiar el nombre de 'y/|/_/' * ¿así?

gracias por cualquier sugerencia

Respuesta1

Sí, el comando (basado en Perl) renamees un buen candidato para esto. Puede agregar la opción -no --nonopara realizar una prueba de los reemplazos, por ejemplo:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

así por ejemplo

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

renameTenga en cuenta quenole permite sobrescribir archivos de forma destructiva si sus nombres no son únicos:

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

Tenga en cuenta que .esnoun carácter especial en el contexto de los nombres de archivos, por lo que sugeriría no reemplazarlo.

Respuesta2

En general, mmves excelente para tareas de cambio de nombre masivo.

Pero en este caso particular, tomaría una ruta completamente diferente: generar un script de shell con un par de comandos de shell, observarlo de cerca si es realmente lo que quiero y luego ejecutarlo.

Diseño preliminar:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Qagregará comillas dobles alrededor de cada nombre, es decir, le dará "foo*bar"o "foo | bar".

Luego reemplace los caracteres no deseados en /tmp/new.txt, ya sea manualmente con un editor o con sed -i -e(o perl -p -i -esi lo prefiere) o tro tr -d. Importante:¡No cambie el orden en ese archivo y no elimine ni agregue ninguna línea!

En cualquier caso, observe detenidamente /tmp/new.txtpara ver si realmente es como desea que se vean los nuevos nombres.

¡Compruebe si hay nombres duplicados! ( sort /tmp/new.txt | uniq -r) Asegúrese de que no haya duplicados y, si los hay, edite esa línea manualmente para obtener un nombre único.

Luego junte los archivos con el pastecomando y cambie cada línea a un mvcomando:

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

Lo que hace ese pastecomando es tomar una línea de /tmp/old.txty una línea de /tmp/new.txty juntarlas en una sola línea con un espacio en blanco entre ellas. La sedparte agrega una mv -nal comienzo de cada una de esas líneas. mv -nevita sobrescribir un archivo existente.

Ese archivo ahora contiene muchas líneas como

mv -n "foo" "bar"
mv -n "abc" "def"

Mire el archivo nuevamente y cuando esté seguro de que es lo que desea, ejecútelo con sh /tmp/bulk-rename.

información relacionada