Si sus nombres de archivo no contienen espacios en blanco y no tiene subdirectorios, puede usar un forciclo simple :
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
De lo contrario, use el renamecomando 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
@Matteo: Gracias por la pista: actualicé mi respuesta con una advertencia más dos ejemplos con find.
miku
También recomendaría for f in *; do [[ -f ${f} ]] && mv ...; donecapturar solo archivos (sin subdirectorios, enlaces, etc.) ...
twalberg
1
Si cita las variables como debería, entonces for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; donefunciona 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.
Jonathan Leffler
De alguna manera, esto agregó un .antes de todos mis archivos
nulabilidad
75
Pruebe el renamecomando 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 .
Tenga cuidado con el procesamiento de la salida de ls: puede provocar problemas si hay espacios u otros caracteres extraños en los nombres de archivo.
Jonathan Leffler
15
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.
Respuestas:
Si sus nombres de archivo no contienen espacios en blanco y no tiene subdirectorios, puede usar un
for
ciclo simple :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 conrename
).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:En los sistemas BSD
-printf
, desafortunadamente , no hay opción. Pero GNU findutils debería ser instalable (por ejemplo, en Mac OS X conbrew install findutils
).fuente
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 archivosPruebe el
rename
comando en la carpeta con los archivos :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 .
fuente
's/^/.../'
significa?'s/^/.../'
es el argumento de expresión de perl para el comando de cambio de nombrerename 's/^start_/run_' *
Creo que esto es justo lo que estás buscando:
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)
fuente
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.
fuente
Puedes usar en
-i
lugar de-I {}
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 sixargs
obtiene más de dos argumentos como entradaUsando awk:
fuente
-i
está en desuso, ahora es solo-I
También funciona para elementos con espacios e ignora directorios
fuente
Con rnm (necesitará instalarlo):
O
PD: soy el autor de esta herramienta.
fuente
rename
no me funciona, perornm
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 conss
.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.fuente
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:
o para afectar solo archivos:
-execdir
firstcd
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
fuente