Tengo que cambiar el nombre de un árbol de carpetas completo de forma recursiva para que no aparezca ninguna letra mayúscula en ninguna parte (es el código fuente de C ++, pero eso no debería importar).
Puntos de bonificación por ignorar los archivos / carpetas de control de versiones de CVS y Subversion. La forma preferida sería un script de shell, ya que un shell debería estar disponible en cualquier caja de Linux.
Hubo algunos argumentos válidos sobre los detalles del cambio de nombre del archivo.
Creo que los archivos con los mismos nombres en minúsculas deberían sobrescribirse; Es el problema del usuario. Cuando se desprotege en un sistema de archivos que ignora las mayúsculas y minúsculas, también sobrescribirá el primero con el último.
Consideraría los caracteres AZ y los transformaría en az, todo lo demás solo requiere problemas (al menos con el código fuente).
El script sería necesario para ejecutar una compilación en un sistema Linux, por lo que creo que los cambios en los archivos de control de versión CVS o Subversion deberían omitirse. Después de todo, es solo un pago desde cero. Quizás una "exportación" sea más apropiada.
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 nombreRespuestas:
Una versión concisa usando el
"rename"
comando:Esto evita problemas con el cambio de nombre de los directorios antes que los archivos y el intento de mover archivos a directorios no existentes (por ejemplo,
"A/A"
a"a/a"
).O una versión más detallada sin usar
"rename"
.PD
Este último permite más flexibilidad con el comando mover (por ejemplo,
"svn mv"
).fuente
then
línea cerrada por(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Agregue -f para cambiar el nombre si está en un sistema de archivos que no distingue entre mayúsculas y minúsculas (por ejemplo, Mac)-T
elmv
comando.Más pequeño todavía me gusta bastante:
En sistemas de archivos que no distinguen entre mayúsculas y minúsculas, como HFS + de OS X , querrá agregar el
-f
indicador:fuente
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(y es proporcionado por un paquete con el mismo nombre)fuente
find
.find .
Parece arreglar esto.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Simplemente intente lo siguiente si no necesita preocuparse por la eficiencia.
fuente
-0
(Eso es 'cero', sin compresión) del interruptor,zip -0 -r foo.zip foo/
.-0
compresión, fue casi instantáneo!Hombre, a ustedes / chicas les gusta complicar más las cosas ... Uso:
fuente
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, es decir, intente cambiar el nombre de la ruta completa en lugar de solo el archivo.La mayoría de las respuestas anteriores son peligrosas, ya que no tratan con nombres que contienen caracteres extraños. Su apuesta más segura para este tipo de cosas es usar
find
la-print0
opción, que terminará los nombres de archivo con ASCII NUL en lugar de \ n.Aquí hay un script, que solo altera los archivos y no los nombres de directorio para no confundir
find
:Lo probé y funciona con nombres de archivos que contienen espacios, todo tipo de citas, etc. Esto es importante porque si ejecuta, como root, uno de esos otros scripts en un árbol que incluye el archivo creado por
... bien adivina que ...
fuente
rename
lugar demv
.Esto funciona si ya tiene o configuró el comando de cambio de nombre (por ejemplo, a través de brew install en Mac):
fuente
brew install rename
--lower-case
? Ese no es el caso en Arch Linux al menos, lamentablemente.rename
No es un bash incorporado. Es una utilidad externa y la sintaxis diferirá según la versión que haya instalado. Esta respuesta no es suficiente como una solución portátil "para todos los sistemas operativos basados en Unix" como se afirma.rename
comando incluido en el último Fedora (28), a través delutil-linux-2.31
paquete, no tiene la--lower-case
opción.Esto funciona en CentOS / Red Hat Linux u otras distribuciones sin el
rename
script Perl:Fuente: cambie el nombre de todos los nombres de archivo de mayúsculas a minúsculas
(En algunas distribuciones, el
rename
comando predeterminado proviene de util-linux, y esa es una herramienta diferente e incompatible).fuente
El enfoque más simple que encontré en Mac OS X fue usar el paquete de cambio de nombre de http://plasmasturm.org/code/rename/ :
fuente
Aquí está mi solución subóptima, usando un script de shell Bash:
Todas las carpetas se renombraron correctamente y
mv
no hacen preguntas cuando los permisos no coinciden, y las carpetas CVS no se renombran (los archivos de control CVS dentro de esa carpeta todavía se renombran, desafortunadamente).Como "find -depth" y "find | sort -r" devuelven la lista de carpetas en un orden utilizable para cambiar el nombre, preferí usar "-depth" para buscar carpetas.
fuente
La pregunta original pedía ignorar los directorios SVN y CVS, lo que se puede hacer agregando -prune al comando find. Por ejemplo, para ignorar CVS:
[editar] Probé esto, e incrustar la traducción en minúsculas dentro del hallazgo no funcionó por razones que realmente no entiendo. Entonces, modifique esto para:
Ian
fuente
Usando el fijador de nombre de archivo de Larry Wall:
Es tan simple como
(¿Dónde
fix
está, por supuesto, el guión anterior)fuente
Este es un pequeño script de shell que hace lo que solicitó:
Tenga en cuenta la acción de profundidad en el primer hallazgo.
fuente
No portátil, solo Zsh, pero bastante conciso.
Primero, asegúrese de que
zmv
esté cargado.Además, asegúrese de que
extendedglob
esté encendido:Luego use:
Para recursivamente archivos y directorios en minúsculas donde el nombre no es CVS .
fuente
find -depth
imprime cada archivo y directorio, con el contenido de un directorio impreso antes del directorio en sí.${f,,}
en minúsculas el nombre del archivo.fuente
-depth
arreglos que! Esta es una solución realmente rápida, pero, por supuesto, sin usar la-print0
opción de buscar, no es la más confiableCon MacOS
Instala el
rename
paquete,Utilizar,
Este comando busca todos los archivos con una
*.py
extensión y convierte los nombres de los archivos a minúsculas.Por ejemplo,
fuente
-I
opción porxargs
aquí?- I
bandera no es obligatoria. Se usa cuando ejecutamos múltiples comandos conxargs
. Aquí hay un ejemplo del uso de múltiples comandos conxargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
Puede ejecutar sin-I
comofind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Usar tipografía :
En Windows, las emulaciones, como Git Bash , pueden fallar porque Windows no distingue entre mayúsculas y minúsculas. Para ellos, agregue un paso que
mv
es el archivo a otro nombre primero, como "$ old.tmp", y luego a$new
.fuente
Largo pero "funciona sin sorpresas ni instalaciones"
Este script maneja nombres de archivos con espacios, comillas, otros caracteres inusuales y Unicode, funciona en sistemas de archivos que no distinguen entre mayúsculas y minúsculas y en la mayoría de los entornos Unix-y que tienen instalado bash y awk (es decir, casi todos). También informa sobre colisiones si las hay (dejando el nombre de archivo en mayúsculas) y, por supuesto, cambia el nombre de los archivos y directorios y funciona de forma recursiva. Finalmente, es altamente adaptable: puede ajustar el comando find para apuntar a los archivos / directorios que desee y puede ajustar awk para hacer otras manipulaciones de nombres. Tenga en cuenta que con "maneja Unicode" quiero decir que efectivamente convertirá su caso (no los ignorará como las respuestas que usan
tr
).Referencias
Mi guión se basa en estas excelentes respuestas:
/unix/9496/looping-through-files-with-spaces-in-the-names
¿Cómo convertir una cadena a minúsculas en Bash?
fuente
Esto también funciona bien en macOS:
fuente
Necesitaba hacer esto en una configuración de Cygwin en Windows 7 y descubrí que recibí errores de sintaxis con las sugerencias anteriores que probé (aunque es posible que haya perdido una opción de trabajo). Sin embargo, esta solución directamente de los foros de Ubuntu funcionó de la lata :-)
(Nota: anteriormente había reemplazado espacios en blanco con guiones bajos usando:
)
fuente
En OS X,
mv -f
muestra el error "mismo archivo", así que cambio el nombre dos veces:fuente
Llegaría a Python en esta situación, para evitar asumir caminos optimistas sin espacios ni barras. También he descubierto que
python2
tiende a instalarse en más lugares querename
.fuente
Si usa Arch Linux , puede instalar
rename
) el paqueteAUR
que proporciona elrenamexm
comando como/usr/bin/renamexm
ejecutable y una página de manual junto con él.Es una herramienta realmente poderosa para renombrar rápidamente archivos y directorios.
Convertir a minúsculas
Convertir a caja SUPERIOR
Otras opciones
Puede obtener el archivo de ejemplo Developers.mp3 desde aquí , si es necesario;)
fuente
brew
el nombre de en macOS ha-l
obligado a crear un enlace simbólico y-c
a la conversión a minúsculas, así que ten cuidado.Primero cambie el nombre de los directorios de abajo hacia arriba ordenar -r (donde -depth no está disponible), luego los archivos. Luego grep -v / CVS en lugar de find ...- pode porque es más simple. Para directorios grandes, para f en ... puede desbordar algunos búferes de shell. Utilizar buscar ... | mientras lee para evitar eso.
Y sí, esto bloqueará los archivos que difieren solo en caso de que ...
fuente
find YOURDIR -type d | sort -r
es demasiado problema. Que deseafind YOURDIR -depth -type d
. En segundo lugar,find -type f
DEBE ejecutarse después de que los directorios hayan cambiado de nombre.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 defind
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:
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.
Esta parte lee los archivos generados por
find
y los formatea en unmv
comando utilizando una expresión regular. La-n
opción dejased
de imprimir la entrada, y elp
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 demv
asegura que los archivos minúsculos existentes no se sobrescriban. La-v
opción realiza lamv
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)Esto se explica por sí mismo. Enruta todos los
mv
comandos generados al intérprete de shell. Puede reemplazarlo conbash
o cualquier caparazón de su agrado.fuente
Slugify Rename (regex)
No es exactamente lo que solicitó el OP, sino lo que esperaba encontrar en esta página:
Una versión "slugify" para renombrar archivos para que sean similares a las URL (es decir, solo incluyen caracteres alfanuméricos, puntos y guiones):
fuente