it-swarm-es.com

Cambiar el nombre de los archivos en linux con una expresión regular

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

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

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

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

Solía ​​escribir scripts en Perl para hacer esto, hasta que descubrí el comando de cambio de nombre.

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

para esto, acabo de escribir 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, rename no tiene esta funcionalidad (consulte su página de manual), y es posible que deba instalar Perl-rename o prename.

14
Osama ALASSIRY

Como no tengo un comando de cambio de nombre, confío en esto:

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

rename util no es muy "estándar". Cada distribución se envía con una herramienta rename diferente. Por ejemplo, aquí en Gentoo, rename es de sys-apps/util-linux paquete y no admite expresiones regulares.

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

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

Tanto mmv como qmv son 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 automáticamente crearán un archivo temporal si es necesario.

4
Denilson Sá Maia

mmv es una utilidad estándar de Linux para mover/renombrar varios 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 debaday o el página de manual .

4
Hamish Downer

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}

1
fpba

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
1
bjarkig82