find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
No he probado los scripts más elaborados que se mencionan aquí, pero ninguna de las versiones de línea de comandos me funcionó en mi Synology NAS. rename
no está disponible, y muchas de las variaciones de find
falla porque parece quedarse con el nombre anterior de la ruta ya renombrada (por ejemplo, si encuentra ./FOO
seguido ./FOO/BAR
, renombrar ./FOO
a ./foo
continuará en la lista ./FOO/BAR
aunque esa ruta ya no sea válida) . El comando anterior funcionó para mí sin ningún problema.
Lo que sigue es una explicación de cada parte del comando:
find . -depth -name '*[A-Z]*'
Esto buscará cualquier archivo del directorio actual (cambie .
a cualquier directorio que desee procesar), utilizando una búsqueda profunda (por ejemplo, aparecerá en la lista ./foo/bar
antes ./foo
), pero solo para los archivos que contienen un carácter en mayúscula. El -name
filtro solo se aplica al nombre del archivo base, no a la ruta completa. Entonces esto aparecerá en la lista ./FOO/BAR
pero no ./FOO/bar
. Esto está bien, ya que no queremos cambiar el nombre ./FOO/bar
. Sin ./FOO
embargo, queremos cambiar el nombre , pero ese aparece más adelante (por eso -depth
es importante).
Este comando en sí mismo es particularmente útil para encontrar los archivos cuyo nombre desea cambiar en primer lugar. Use esto después del comando de cambio de nombre completo para buscar archivos que aún no se hayan reemplazado debido a colisiones o errores de nombre de archivo.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Esta parte lee los archivos generados por find
y los formatea en un mv
comando utilizando una expresión regular. La -n
opción deja sed
de imprimir la entrada, y el p
comando en la expresión regular de búsqueda y reemplazo genera el texto reemplazado.
La expresión regular en sí consta de dos capturas: la parte hasta el último / (que es el directorio del archivo) y el nombre del archivo en sí. El directorio se deja intacto, pero el nombre del archivo se transforma en minúsculas. Entonces, si find
sale ./FOO/BAR
, se convertirá mv -n -v -T ./FOO/BAR ./FOO/bar
. La -n
opción de mv
asegura que los archivos minúsculos existentes no se sobrescriban. La -v
opción realiza la mv
salida de cada cambio que realiza (o no realiza, si ./FOO/bar
ya existe, genera algo como ./FOO/BAR -> ./FOO/BAR
, señalando que no se ha realizado ningún cambio). El -T
es muy importante en este caso - que trata el archivo de destino como un directorio. Esto asegurará que ./FOO/BAR
no se traslade ./FOO/bar
si ese directorio existe.
Use esto junto con find
para generar una lista de comandos que se ejecutarán (útil para verificar lo que se hará sin realmente hacerlo)
sh
Esto se explica por sí mismo. Enruta todos los mv
comandos generados al intérprete de shell. Puede reemplazarlo con bash
o cualquier caparazón de su agrado.
ABCdef
,abcDEF
yaBcDeF
? ¿Debería el script renombrar abortar o simplemente advertir y continuar? 2. ¿Cómo define minúsculas para nombres que no sean ASCII de EE. UU.? Si tales nombres pueden estar presentes, ¿se debe verificar primero y excluir el pase? 3. Si está ejecutando una operación de cambio de nombre