Supongamos que tengo un montón de archivos nombrados de esta manera:
file01.txt file02.txt file03.txt ... file20.txt
y quiero ejecutar un comando en un rango de estos archivos.
Sé que si quiero 'rm' de 'file05.txt' a 'file09.txt' puedo hacer:
rm file0[5-9].txt
pero, ¿cómo puedo 'rm' un rango de file08.txt a file13.txt? Probé este código
rm file[08-13].txt
y no funciona Podría ejecutar este comando:
rm file0[89].txt file1[0-3].txt
pero me gustaría saber si puedo hacer esto con solo un argumento refinado más para 'rm' si es posible.

Respuestas:
Debe usar la expansión de llaves de
bash:Esto eliminará los archivos
file08afile13, se mostrará un mensaje de error si el archivo no existe ninguna.Establezca el rango para satisfacer sus necesidades.
El problema con el operador global
[]es que trata cada carácter / dígito dentro de él como una sola ficha y, por lo tanto, solo admite la declaración de rango con dígitos únicos.Si insiste en usar
[], puede usar este patrón bastante feo para que coincidafile08confile13:fuente
mv foo.{txt,md}orcp foo.txt{,.bak}Algunos shells, como el predeterminado de Ubuntu
/bin/sh(que esdash) omkshno tienen expansión de llaves, o en el caso deksh- la expansión de llaves no puede usar ceros rellenos:En tales casos, podemos usar
printfpara formatear la parte del número del nombre de archivo y usar un bucle while para implementar el comportamiento de bucle c-like (nota para reemplazarechoconrmo lo que quieras):Y esto es bastante portátil - trabaja con
dash,ksh,mksh, tambiénbash. En el caso dekshybashtambién podemos usarc-style for loop syntax (but not in case ofmkshordash`):Tenga en cuenta que, en
bashel caso,printfadmite la impresión en variable y, por lo tanto, podríamos hacerlo enprintf -v num "%.2d" "$i"lugar de utilizar la sustitución de comandos.fuente