Cambiar el nombre de todos los archivos dentro de una carpeta con prefijo "Unix_"
Supongamos que una carpeta tiene dos archivos
a.txt
b.pdf
entonces ambos deben ser renombrados de un solo comando a
Unix_a.txt
Unix_b.pdf
Cambiar el nombre de todos los archivos dentro de una carpeta con prefijo "Unix_"
Supongamos que una carpeta tiene dos archivos
a.txt
b.pdf
entonces ambos deben ser renombrados de un solo comando a
Unix_a.txt
Unix_b.pdf
Respuestas:
Si sus nombres de archivo no contienen espacios en blanco y no tiene subdirectorios, puede usar un for
ciclo simple :
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
De lo contrario, use el rename
comando conveniente (que es un script de Perl), aunque puede que no esté disponible en todos los Unix (por ejemplo, OS X no viene con rename
).
Una breve descripción en debian-administration.org:
Si sus nombres de archivo contienen espacios en blanco, es más fácil de usar find
, en Linux lo siguiente debería funcionar:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
En los sistemas BSD -printf
, desafortunadamente , no hay opción. Pero GNU findutils debería ser instalable (por ejemplo, en Mac OS X con brew install findutils
).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
capturar solo archivos (sin subdirectorios, enlaces, etc.) ...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
funciona correctamente independientemente de los caracteres que haya en los nombres de los archivos. Mueve directorios, sockets, enlaces simbólicos y otros tipos de archivos también; Supongo que eso no importa.
.
antes de todos mis archivos
Pruebe el rename
comando en la carpeta con los archivos :
rename 's/^/Unix_/' *
El argumento de renombrar ( comando sed s ) indica reemplazar la expresión regular ^ con Unix_ . El signo de intercalación (^) es un carácter especial que significa el comienzo de la línea .
's/^/.../'
significa?
's/^/.../'
es el argumento de expresión de perl para el comando de cambio de nombre
rename 's/^start_/run_' *
Creo que esto es justo lo que estás buscando:
ls | xargs -I {} mv {} Unix_{}
Sí, es simple pero elegante y poderoso, y también de una sola línea. Puede obtener una introducción más detallada de mí en la página: Cambiar nombre de archivos y directorios (agregar prefijo)
ls
: puede provocar problemas si hay espacios u otros caracteres extraños en los nombres de archivo.
Recientemente enfrenté esta misma situación y encontré una solución incorporada más fácil. Lo comparto aquí para que pueda ayudar a otras personas que buscan una solución.
Con OS X Yosemite, Apple ha integrado las capacidades de cambio de nombre de lotes directamente en Finder. La información detallada está disponible aquí . También he copiado los pasos a continuación,
Cambiar el nombre de varios elementos
Seleccione los elementos, luego presione Control y haga clic en uno de ellos.
En el menú de acceso directo, seleccione Cambiar nombre de elementos.
En el menú emergente debajo de Cambiar nombre de elementos de carpeta, elija reemplazar texto en los nombres, agregar texto a los nombres o cambiar el formato del nombre.
Reemplazar texto: ingrese el texto que desea eliminar en el campo Buscar, luego ingrese el texto que desea agregar en el campo "Reemplazar con".
Agregar texto: ingrese el texto que desea agregar en el campo, luego elija agregar el texto antes o después del nombre actual.
Formato: elija un formato de nombre para los archivos, luego elija poner el índice, el contador o la fecha antes o después del nombre. Ingrese un nombre en el campo Formato personalizado, luego ingrese el número con el que desea comenzar.
Haga clic en Cambiar nombre.
Si tiene un patrón común en sus archivos, puede usar Reemplazar texto; de lo contrario, Agregar texto también funcionaría.
Puedes usar en -i
lugar de-I {}
ls | xargs -i mv {} unix_{}
Esto también funciona perfectamente.
ls
- enumera todos los archivos en el directorioxargs
- acepta todos los archivos línea por línea debido a la -i
opción{}
es el marcador de posición para todos los archivos, necesario si xargs
obtiene más de dos argumentos como entradaUsando awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
está en desuso, ahora es solo-I
También funciona para elementos con espacios e ignora directorios
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Con rnm (necesitará instalarlo):
rnm -ns 'Unix_/fn/' *
O
rnm -rs '/^/Unix_/' *
PD: soy el autor de esta herramienta.
rename
no me funciona, pero rnm
sí.
Situación:
Tenemos certificate.key
certificate.crt
dentro/user/ssl/
Queremos cambiar el nombre de cualquier cosa que empieza con certificate
acertificate_OLD
Ahora estamos ubicados dentro /user
Primero, haces un ensayo con -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
Que devuelve:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
Sus archivos no cambiarán, esto es solo una prueba.
Solución:
Cuando esté satisfecho con el resultado de la prueba, ejecútelo de verdad:
rename "s/certificate/certificate_OLD/" ./ssl/*
Qué significa:
`cambiar el nombre de" s / SOMETHING / SOMETING_ELSE "RUTA / ARCHIVOS
Propina:
Si ya está en el camino, ejecútelo así:
rename "s/certificate/certificate_OLD/" *
O si desea hacer esto en cualquier subdirectorio que comience con ss
hacer:
rename -n "s/certificat/certificate_old/" ./ss*/*
También puedes hacer:
rename -n "s/certi*/certificate_old/" ./ss*/*
Que cambia el nombre de cualquier cosa que comience con certi
en cualquier subdirectorio que comience con ss
.
El cielo es el limite.
Juega con expresiones regulares y SIEMPRE prueba esto ANTES con -n
.
TENGA CUIDADO QUE INCLUSO CAMBIARÁ EL NOMBRE DE CARPETA QUE COINCIDAN Mejor cd
en el directorio y hacerlo allí. UTILICE BAJO SU PROPIO RIESGO.
find -execdir rename
Esto cambia el nombre de archivos y directorios con una expresión regular que afecta solo a los nombres de base.
Entonces, para un prefijo, puede hacer:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
o para afectar solo archivos:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
first cd
s en el directorio antes de ejecutar solo en el nombre base.
Lo he explicado con más detalle en: Encuentre varios archivos y cámbieles el nombre en Linux