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,abcDEFyaBcDeF? ¿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
thenlí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)-Telmvcomando.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
-findicador:fuente
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prenameperl-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]'`"; doneSimplemente 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/.-0compresió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
findla-print0opció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
renamelugar 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.renameNo 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.renamecomando incluido en el último Fedora (28), a través delutil-linux-2.31paquete, no tiene la--lower-caseopción.Esto funciona en CentOS / Red Hat Linux u otras distribuciones sin el
renamescript Perl:Fuente: cambie el nombre de todos los nombres de archivo de mayúsculas a minúsculas
(En algunas distribuciones, el
renamecomando 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
mvno 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
fixestá, 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
zmvesté cargado.Además, asegúrese de que
extendedglobesté encendido:Luego use:
Para recursivamente archivos y directorios en minúsculas donde el nombre no es CVS .
fuente
find -depthimprime 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
-deptharreglos que! Esta es una solución realmente rápida, pero, por supuesto, sin usar la-print0opción de buscar, no es la más confiableCon MacOS
Instala el
renamepaquete,Utilizar,
Este comando busca todos los archivos con una
*.pyextensión y convierte los nombres de los archivos a minúsculas.Por ejemplo,
fuente
-Iopción porxargsaquí?- Ibandera no es obligatoria. Se usa cuando ejecutamos múltiples comandos conxargs. Aquí hay un ejemplo del uso de múltiples comandos conxargscat foo.txt | xargs -I % sh -c 'echo %; mkdir %'Puede ejecutar sin-Icomofind . -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
mves 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 -fmuestra 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
python2tiende a instalarse en más lugares querename.fuente
Si usa Arch Linux , puede instalar
rename) el paqueteAURque proporciona elrenamexmcomando como/usr/bin/renamexmejecutable 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
brewel nombre de en macOS ha-lobligado a crear un enlace simbólico y-ca 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 -res demasiado problema. Que deseafind YOURDIR -depth -type d. En segundo lugar,find -type fDEBE 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.
renameno está disponible, y muchas de las variaciones defindfalla porque parece quedarse con el nombre anterior de la ruta ya renombrada (por ejemplo, si encuentra./FOOseguido./FOO/BAR, renombrar./FOOa./foocontinuará en la lista./FOO/BARaunque 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/barantes./foo), pero solo para los archivos que contienen un carácter en mayúscula. El-namefiltro solo se aplica al nombre del archivo base, no a la ruta completa. Entonces esto aparecerá en la lista./FOO/BARpero no./FOO/bar. Esto está bien, ya que no queremos cambiar el nombre./FOO/bar. Sin./FOOembargo, queremos cambiar el nombre , pero ese aparece más adelante (por eso-depthes 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
findy los formatea en unmvcomando utilizando una expresión regular. La-nopción dejasedde imprimir la entrada, y elpcomando 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
findsale./FOO/BAR, se convertirámv -n -v -T ./FOO/BAR ./FOO/bar. La-nopción demvasegura que los archivos minúsculos existentes no se sobrescriban. La-vopción realiza lamvsalida de cada cambio que realiza (o no realiza, si./FOO/barya existe, genera algo como./FOO/BAR -> ./FOO/BAR, señalando que no se ha realizado ningún cambio). El-Tes muy importante en este caso - que trata el archivo de destino como un directorio. Esto asegurará que./FOO/BARno se traslade./FOO/barsi ese directorio existe.Use esto junto con
findpara 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
mvcomandos generados al intérprete de shell. Puede reemplazarlo conbasho 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