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 tugrep
invocación, así que supongo que el comportamiento te conviene o sabes cómo cambiarlo.*
coincide con los directorios. Sugrep
fue 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 molestarsegrep
en 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,
continue
después del primerogrep
. Está ahí para no llamar al segundogrep
en vano. - Si espera muchos archivos
HG-U133B
y solo unos pocos,HG-U133A
considere realizar la pruebaHG-U133B
primero.
Ventajas:
- portabilidad,
- robustez (el código debería funcionar bien independientemente de los nombres de los archivos).
Desventaja:
- generar al menos un
grep
proceso 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 bash
lo 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