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
file08
afile13
, 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 coincidafile08
confile13
:fuente
mv foo.{txt,md}
orcp foo.txt{,.bak}
Algunos shells, como el predeterminado de Ubuntu
/bin/sh
(que esdash
) omksh
no 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
printf
para 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 reemplazarecho
conrm
o lo que quieras):Y esto es bastante portátil - trabaja con
dash
,ksh
,mksh
, tambiénbash
. En el caso deksh
ybash
también podemos usarc-style for loop syntax (but not in case of
mkshor
dash`):Tenga en cuenta que, en
bash
el caso,printf
admite 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