Me gustaría cambiar el nombre de forma recursiva de todos los archivos y carpetas (subcarpetas) a mayúsculas.
Encontré algunos scripts que lo harán en minúsculas, pero no sé cómo cambiarlos, así que lo haré al revés (de abajo hacia arriba).
El script que encontré y funciona en minúsculas, pero no sabía cómo modificarlo es:
rename 'y/A-Z/a-z/' *
Es a partir de man rename
.
rename 'y/a-z/A-Z/' *
obtendrás lo que quieres. Cuidado donde lo pruebas.Respuestas:
Tenga en cuenta que está utilizando el script Perl llamado
rename
distribuido por Debian y derivados (Ubuntu, Mint, ...). Otras distribuciones de Linux incluyen un comando llamado completamente diferente y considerablemente menos útilrename
.y/A-Z/a-z/
traduce cada carácter en el rangoA
medioZ
en el carácter correspondiente en la gamaa
a travész
, por ejemplo, ASCII letras mayúsculas a la letra minúscula correspondiente. Para realizar la traducción opuesta, usey/a-z/A-Z/
. Otra manera de escribir el mismo comando esrename '$_ = uc($_)' *
-uc
es la U pper c función del ase, y elrename
comando cambia el nombre de archivos basado en la transformación hecha a la$_
variable.rename '…' *
solo cambia el nombre de los archivos en el directorio actual, porque eso es lo que*
coincide. Los archivos de puntos (archivos cuyo nombre comienza con.
) también se omiten.Si desea cambiar el nombre de los archivos en el directorio actual y en subdirectorios de forma recursiva, puede utilizar el
find
comando para recorrer el directorio actual de forma recursiva. Aquí hay una dificultad: si llamarename
, esto cambia el nombre del directorio y la parte del nombre base. Si llamarename
a un directorio antes de recurrir a él (find -exec rename … {} \;
),find
se confunde porque ha encontrado un directorio pero ese directorio ya no existe cuando intenta descender a él. Puede solucionar esto diciendofind
que atravesar un directorio antes de actuar sobre ella, pero luego terminan intentar cambiar el nombrefoo/bar
aFOO/BAR
pero el directorioFOO
no existe.Una forma sencilla de evitar esta dificultad es hacer que el comando de cambio de nombre actúe solo en la parte del nombre base de la ruta. La expresión regular
([^/]*\Z)
coincide con la parte final de la ruta que no contiene a/
.El shell zsh proporciona características más convenientes para renombrar, incluso más críptico que Perl, pero más terso y, a menudo, más fácil de componer.
La función
zmv
renombra archivos basados en patrones. Correautoload -U zmv
una vez para activarlo (pon esta línea en tu.zshrc
).En el primer argumento de
zmv
(el patrón a reemplazar), puede usar los poderosos patrones comodín de zsh . En el segundo argumento dezmv
(el texto de reemplazo), puede usar sus funciones de expansión de parámetros , incluidos los modificadores del historial .Explicación:
-w
- Asigna automáticamente variables numéricas a cada patrón comodín**/*
- todos los archivos en subdirectorios, recursivamente (**/
coincide con 0, 1 o más niveles de subdirectorios)$1
- la primera variable numérica, que aquí coincide con la parte del directorio de cada ruta$2:u
- la segunda variable numérica, que aquí coincide con la parte del nombre base de cada ruta, con el:u
modificador para convertir el valor a mayúsculasComo una ventaja adicional, esto respeta la configuración regional del entorno.
Si no está seguro acerca de un
zmv
comando que escribió, puede pasar la-n
opción de imprimir lo que haría el comando y no cambiar nada. Verifique la salida y, si hace lo que desea, vuelva a ejecutar el comando sin-n
actuar realmente.fuente
Robado (con una edición menor) de la publicación de Gilles aquí
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
fuente
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
recurre a ellos.find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
lo tanto, debe manejar el problema de cambio de nombre de los directorios. ¿Correcto?rename
cambios , por ejemplo,foo/bar
enFOO/BAR
yFOO
no existen en ese momento.Me gustaría dirigir a cualquiera que todavía esté vinculado a esta respuesta a la excelente respuesta que Guiles Quernot dio a esta pregunta que no requiere
find
.El comando resultante sería:
Pero antes de ejecutar, lea la respuesta vinculada a las advertencias con respecto a las versiones antiguas de bash.
Finalmente, en caso de que alguien se pregunte qué hace el
y///
comandoperl regex
. Aquí hay un enlace a la documentación relevante .fuente
find -execdir
El | rebautizarEsta sería la mejor manera de hacerlo si no fuera por la locura de la ruta relativa, ya que evita que Perl regex fu solo actúe en el nombre base:
-execdir
primerocd
s en el directorio antes de ejecutar solo en el nombre base.Desafortunadamente, no puedo deshacerme de esa
PATH
parte de piratería, sefind -execdir
niega a hacer nada si tiene una ruta relativa enPATH
...: /ubuntu/621132/why-using-the-execdir-action- is-insecure-for-directory-which-is-in-the-path / 1109378 # 1109378fuente
Pruebe esto después de pasar al directorio donde desea cambiar el nombre de los archivos:
fuente
ls -l
solo para cortar las columnas que no sean el nombre?), Y use comillas dobles alrededor de sustituciones variables . Su código es demasiado complejo y se rompe en los nombres de archivo que contienen espacios en blanco y otros caracteres especiales. Usefind
o**/
para recurrir a subdirectorios, la salida dels
es solo para consumo humano.