Cambie el nombre de todos los archivos en una carpeta con un prefijo en un solo comando

Respuestas:

107

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
miku
fuente
@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 .

pavium
fuente
8
¿Podría explicar qué 's/^/.../'significa?
mcont
@Matteo 's/^/.../'es el argumento de expresión de perl para el comando de cambio de nombre
RoyalleBlue
esto es asombroso! Sugeriría agregar la carpeta / *, porque * es un poco peligroso si el comando se repite accidentalmente en otro lugar
Systems Rebooter
brew install renombrar @OliverPearmain
Felipe Plazas
Ejemplo para reemplazar un prefijo:rename 's/^start_/run_' *
DenisKolodin
35

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)

Zheng Qsin
fuente
2
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

  1. Seleccione los elementos, luego presione Control y haga clic en uno de ellos.

  2. En el menú de acceso directo, seleccione Cambiar nombre de elementos.

  3. 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.

  4. 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.

Tejas C
fuente
Excelente, ¡me ahorró mucho tiempo!
user3000868
6

Puedes usar en -ilugar de-I {}

ls | xargs -i mv {} unix_{}

Esto también funciona perfectamente.

  • ls - enumera todos los archivos en el directorio
  • xargs- acepta todos los archivos línea por línea debido a la -iopción
  • {}es el marcador de posición para todos los archivos, necesario si xargsobtiene más de dos argumentos como entrada

Usando awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
NirajW
fuente
-iestá en desuso, ahora es solo-I
JamPow
me ha ayudado en Debian 8.Thaks
Abror Esonaliyev
2

También funciona para elementos con espacios e ignora directorios

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
usuario645527
fuente
1

Con rnm (necesitará instalarlo):

rnm -ns 'Unix_/fn/' *

O

rnm -rs '/^/Unix_/' *

PD: soy el autor de esta herramienta.

Jahid
fuente
2
Debe revisar todas sus respuestas sobre su utilidad y agregar la exención de responsabilidad de que es su autor.
Mogsdad
@Mogsdad: No creo que sea una información necesaria. Si alguien quiere encontrar al autor, es bastante fácil.
Jahid
Gracias por esta herramienta. Por alguna razón, renameno me funciona, pero rnmsí.
Aloso
0

Situación:

Tenemos certificate.key certificate.crtdentro/user/ssl/

Queremos cambiar el nombre de cualquier cosa que empieza con certificateacertificate_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 sshacer:

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 certien 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 cden el directorio y hacerlo allí. UTILICE BAJO SU PROPIO RIESGO.

Khalil Gharbaoui
fuente
0

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_/' '{}' \;

-execdirfirst cds 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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente