Eliminazione di file specifici in base al nome file dal terminale


13

Ho una directory contenente file con nomi

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

e così via. Vorrei eliminare tutti quelli che sono un multiplo di 5000.

Ho provato quanto segue:, printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmma questo mi ha dato la risposta rm: missing operand.

c'è un altro modo per fare ciò?


6
Indipendentemente da come lo fai, ti consiglio (per sicurezza) di spostare i file desiderati in una directory, quindi quando hai confermato che tutti e solo i file da eliminare si trovano nella directory, elimina la directory.
user117529

La sicurezza è importante qui. In genere provo lsprima queste cose .
Scot,

Risposte:


49

Non hai bisogno di un ciclo o comandi extra dove hai Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Spiegazione : {start..end..step}. Il -fprompt per ignorare i file inesistenti.


Ps Per mantenere la sicurezza e verificare quali file verranno eliminati, eseguire prima un test con:

ls -1 rho_{0..200000..5000}.txt

13

rmnon legge dallo standard input. Potresti fare:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Includo l' -iopzione per rmrichiedere prima della rimozione in modo da poter verificare il comportamento. Una volta che sei sicuro che stia facendo quello che vuoi, puoi omettere quell'opzione.

Modifica: in alternativa, puoi fare:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Quel modulo può essere più familiare se hai fatto qualche programmazione.


12

Non è possibile eseguire il pipe di un programma come se il contenuto della pipe fosse un argomento. Viene inviato tramite stdin.

Dovresti usare xarg per questo scopo:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

ma prima puoi provare con echo per vedere se tutto è come intendi:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo

Se la tua versione di seqha l' opzione -f/ --formatpuoi usarla al posto di questa soluzione printfalternativa e sostituire i comandi.
David Foerster,

Grazie, ho appena risposto usando il comando usato nella domanda e cercando di spiegare il suo errore rm
M4rty

9

Qualcuno mi corregga se sbaglio, ma se tutti i file che iniziano con rho_questo modulo non sono equivalenti

rm rho_0.txt rho_*[05]000.txt

Poiché un numero (diverso da 0) è un multiplo di 5000 se e solo se termina in 0000 o 5000.

(0 è un caso speciale, poiché è un multiplo di 5000, ma in genere è scritto senza zeri iniziali aggiuntivi. Se non si intendeva includere 0, estrarlo dalla riga precedente.)

Naturalmente questo dovrebbe essere usato solo se tutti i rho_*.txtfile nella tua directory hanno la forma desiderata. Non usarlo se la tua directory contiene anche rho_please_dont_delete_me_5000.txt.

(Nota matematica: funziona proprio perché tutti i fattori primi di 5000, ovvero 2 e 5, sono anche fattori primi della base in cui stiamo lavorando, 10. Equivalentemente, c'è una potenza sufficientemente grande di 10 (vale a dire 10000) che è divisibile per 5000. Non esiste un trucco simile per abbinare tutti quelli che sono multipli di 3000.)


Questa in realtà è la risposta migliore.
cesarv,
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.