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) rename
es un buen candidato para esto. Puede agregar la opción -n
o --nono
para 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)
rename
Tenga 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, mmv
es 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 -Q
agregará 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 -e
si lo prefiere) o tr
o 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.txt
para 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 paste
comando y cambie cada línea a un mv
comando:
paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename
Lo que hace ese paste
comando es tomar una línea de /tmp/old.txt
y una línea de /tmp/new.txt
y juntarlas en una sola línea con un espacio en blanco entre ellas. La sed
parte agrega una mv -n
al comienzo de cada una de esas líneas. mv -n
evita 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
.