Cómo 'rm' o 'mv' un rango de archivos como file01.txt, file02.txt ... file85.txt

23

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.


fuente
Aquí se respondió una pregunta casi idéntica: stackoverflow.com/questions/25049411/…
arielf

Respuestas:

38

Debe usar la expansión de llaves de bash:

rm file{08..13}.txt

Esto eliminará los archivos file08a file13, 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 coincida file08con file13:

rm file0[8-9].txt file1[0-3].txt
heemayl
fuente
55
la expansión de llaves también es útil con comas, como for mv foo.{txt,md}orcp foo.txt{,.bak}
Kos
2

Algunos shells, como el predeterminado de Ubuntu /bin/sh(que es dash) o mkshno tienen expansión de llaves, o en el caso de ksh- la expansión de llaves no puede usar ceros rellenos:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

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 reemplazar echocon rmo lo que quieras):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Y esto es bastante portátil - trabaja con dash, ksh, mksh, también bash. En el caso de kshy bashtambién podemos usar c-style for loop syntax (but not in case ofmksh ordash`):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Tenga en cuenta que, en bashel caso, printfadmite la impresión en variable y, por lo tanto, podríamos hacerlo en printf -v num "%.2d" "$i"lugar de utilizar la sustitución de comandos.

Sergiy Kolodyazhnyy
fuente