Bash: cambie el nombre de todos los archivos que contienen un patrón de expresión regular determinado

Bash: cambie el nombre de todos los archivos que contienen un patrón de expresión regular determinado

Tengo algunos archivos en un directorio que contienen la cadena "HG-U133A" o "HG-U133B". Me gustaría escribir un script que pueda revisar todos los archivos del directorio y cambiar el nombre de todos los archivos "HG-U133A" con un prefijo "A_" y todos los archivos "HG-U133B" con un prefijo "B_".

Entonces, si estos son los archivos en mi directorio

> grep "HG-U133[AB]" *
fileA.txt: HG-U133A
fileB.txt: HG-U133A
fileC.txt: HG-U133B
fileD.txt: HG-U133A
fileE.txt: HG-U133B

Me gustaría escribir un script que pueda cambiar el nombre de estos archivos a

> ls
A_fileA.txt
A_fileB.txt
B_fileC.txt
A_fileD.txt
B_fileE.txt

Realmente agradecería un poco de ayuda con esto. Gracias

Respuesta1

Esta es una solución portátil que no cae en elError número 1 de Bash.

for file in *; do
  [ -f "$file" ] || continue
  grep -q -- HG-U133A "$file" && { mv -- "$file" "A_$file"; continue; }
  grep -q -- HG-U133B "$file" && mv -- "$file" "B_$file"
done

Notas:

  • *no coincide con los archivos dot, pero lo usaste en tu grepinvocación, así que supongo que el comportamiento te conviene o sabes cómo cambiarlo.
  • *coincide con los directorios. Su grepfue invocado sin opciones que pudieran hacer que procese directorios. El script omite todo lo que no sea un archivo normal y el objetivo principal de esto es omitir directorios y no molestarse grepen ejecutarlos (lo que fallaría de todos modos).
  • El doble guión ( --) se explica aquí:¿Qué significa --(doble guión)? (también conocido como “doble guión desnudo”)?Es en caso de que alguno de los nombres de archivo comience con un guión. Si usáramos ./*en lugar de *no lo necesitaríamos.
  • Dijiste "o... o...", lo interpreto como "para un archivo determinado, como máximo una cadena coincidirá". Por tanto, continuedespués del primero grep. Está ahí para no llamar al segundo grepen vano.
  • Si espera muchos archivos HG-U133By solo unos pocos, HG-U133Aconsidere realizar la prueba HG-U133Bprimero.

Ventajas:

  • portabilidad,
  • robustez (el código debería funcionar bien independientemente de los nombres de los archivos).

Desventaja:

  • generar al menos un grepproceso por archivo normal está lejos de ser óptimo; esto puede ralentizar el proceso si hay más de unos pocos archivos para inspeccionar.

Respuesta2

Los siguientes comandos bashlo harán:

for file in `grep -l HG-U133A *` ; do mv "$file" "A_$file" ; done
for file in `grep -l HG-U133B *` ; do mv "$file" "B_$file" ; done

información relacionada