Come 'rm' o 'mv' un intervallo di file come file01.txt, file02.txt… file85.txt


23

Supponiamo di avere un sacco di file chiamati in questo modo:

file01.txt file02.txt file03.txt ... file20.txt

e voglio eseguire un comando su una gamma di questi file.

So che se voglio 'rm' da 'file05.txt' a 'file09.txt' posso fare:

rm file0[5-9].txt

ma come posso 'rm' un intervallo da file08.txt a file13.txt? Ho provato questo codice

rm file[08-13].txt

e non funziona. Potrei eseguire questo comando:

rm file0[89].txt file1[0-3].txt

ma mi piacerebbe sapere se posso farlo con solo un argomento più raffinato per "rm" se è possibile.


Una domanda quasi identico è stato risposto qui: stackoverflow.com/questions/25049411/...
arielf

Risposte:


38

È necessario utilizzare l'espansione del controvento di bash:

rm file{08..13}.txt

Questo rimuoverà i file file08a file13, mostrerà un messaggio di errore se manca qualche file.

Imposta l'intervallo in base alle tue esigenze.


Il problema con l'operatore globbing []è che tratta ogni carattere / cifra al suo interno come un singolo token e quindi supporta solo la dichiarazione di intervallo usando singole cifre.

Se insisti nell'usare [], puoi usare questo modello piuttosto brutto da abbinare file08a file13:

rm file0[8-9].txt file1[0-3].txt

5
l'espansione del controvento è utile anche con le virgole, come per mv foo.{txt,md}ocp foo.txt{,.bak}
Kos,

2

Alcune shell, come quella predefinita di Ubuntu /bin/sh(che è dash) o mkshche non hanno espansione di parentesi graffa, o in caso di ksh- espansione di parentesi graffe non possono usare zeri di riempimento:

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

In questi casi, possiamo usare printfper formattare la parte numerica del nome file e usare un ciclo while per implementare il c-like per il comportamento del ciclo (nota da sostituire echocon rmo qualunque cosa tu voglia):

$ 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

E questo è abbastanza portatile - lavora con dash, ksh, mksh, anche bash. Nel caso di kshe bashpossiamo anche usare 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

Si noti che nel bashcaso, printfsupporta la stampa su variabile, e quindi potremmo fare printf -v num "%.2d" "$i"invece di utilizzare la sostituzione dei comandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.