Renombrar archivos en Linux con una expresión regular

9

Tenía un grupo de archivos que me gustaría cambiar constantemente de nombre, los archivos se llaman cosas como

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

Y los quería como minúsculas, aaaammdd, extensión .log

"system.20090101.log"
"something.20090101.log"
Osama ALASSIRY
fuente

Respuestas:

14

Solía ​​escribir scripts perl para hacer esto, hasta que descubrí el comando renombrar.

Acepta una expresión regular perl para hacer el cambio de nombre:

para esto, solo escribí dos comandos:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Sin embargo, para algunas distribuciones, renameno tiene esta funcionalidad (consulte su página de manual), y es posible que tenga que instalar perl-renameo prename.

Osama ALASSIRY
fuente
muy buena respuesta
Judioo
8
Cuidado, algunas distribuciones envían un comando de cambio de nombre sin valor. Comprueba cuál tiene tu distribución primero.
derobert
Lo sabía, mmvpero finalmente gracias a renameque puedo usar el poder de la expresión regular
Ludovic Kuty
55
En Arch Linux esto es perl-rename.
Oleh Prypin
6

Como no tengo un comando para cambiar el nombre, confío en esto:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
Franz Bettag
fuente
5

mmv es una utilidad estándar de Linux para mover / renombrar múltiples archivos. Está disponible en los repositorios para la mayoría de las distribuciones. Para su ejemplo anterior, podría hacer:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Para obtener más información, lea este artículo de debate o la página de manual .

Hamish Downer
fuente
5

renameutil no es muy "estándar". Cada distribución se envía con una renameherramienta diferente . Por ejemplo, aquí en Gentoo, renamees del sys-apps/util-linuxpaquete y no admite expresiones regulares.

Hamish Downer sugirió mmvque parece útil, especialmente para usar dentro de los scripts.

Por otro lado, para el caso general, es posible que desee cambiar el nombre de los usos . Tiene qmvy qcpcomandos, que abrirán un editor de texto de su elección (mi preferencia: Vim) y le permitirán editar los nombres de archivo de destino allí. Después de guardar y cerrar el editor, qmv/ qcphará todo el cambio de nombre.

Ambos mmvy qmvson lo suficientemente inteligentes como para cambiar el nombre de los archivos en el orden correcto y también para detectar cambios de nombre circulares, y crearán automáticamente un archivo temporal si es necesario.

Denilson Sá Maia
fuente
En Gentoo también puede emerger el sys-apps/renamepaquete, que le proporciona el renamexmcambio de nombre de expresiones regulares, así como mayúsculas / minúsculas en masa y otras cosas buenas.
Radicand
1

Para ser justo:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

da esta salida:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Pero:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

da la salida correcta:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

reemplazando el interruptor {-n} con {-v}

fpba
fuente
1

Creé un pequeño script bash para hacer esto:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done
bjarkig82
fuente
En general, la lssalida de análisis no es la mejor idea. Una búsqueda aleatoria sacó esta lectura larga en Unix. SE para tu diversión. El | Además, su respuesta coincidiría mejor con la pregunta con untr '[:upper:]' '[:lower:]'
HBruijn