Eliminazione di file specifici nella riga di comando


8

Ho file fileName_1 , fileName_2 ... fileName_100000 dove i fileNames sono numerati in sequenza. Come posso eliminare i file di indice maggiori di, diciamo 100 ?

Risposte:


17

Se i nomi dei file sono numerati in sequenza, basta eseguire il comando seguente:

rm fileName_{100..100000}

3
Info: Funziona perché bash (la tua shell) espande {x..y}l'intero elenco. Ad esempio, se lo si utilizza echo test{1..3}verrà espanso echo test1 test2 test3e quindi eseguito. Come puoi vedere, stampa test1 test2 test3. Allo stesso modo, se {x..y}non è collegato a nessun argomento, inserirà semplicemente i numeri lì. Ad esempio echo test {1..3}stamperà e basta test 1 2 3.
Luc,

1
Nota: esiste un limite imposto dalla execchiamata al numero di argomenti che un processo può avere. Puoi recuperarlo con getconf ARG_MAX. Ad esempio sul mio sistema lo è 2097152(~ 2.1 milioni). Ciò significa che rm(che non è un built-in) fallirà con più di tanti file. I comandi integrati non presentano questo problema, né le altre soluzioni proposte.
Bakuriu,

Si noti che ARG_MAX è un numero di byte, non un numero di argomenti. rm non può gestire la cancellazione di 2097152 file in una volta. Potrebbe eliminare 2048 file che avevano ciascuno un nome lungo 1023 byte (non 1024; i delimitatori tra argomenti (\ 0 in C-land) contano ai fini del limite).
godlygeek,

6

Puoi provare anche questo comando,

for i in $(seq 100 100000); do rm fileName_$i; done

Eliminerà tutti i file (intervalli da 100 a 100000) se il nome file contiene numeri in un ordine sequenziale.


5

In generale hai diversi modi per raggiungere questo obiettivo:

rm fileName_{100..100000}

sarà espanso dalla shell in circa 100.000 nomi di file. Se il nome di base è un percorso lungo e il numero è abbastanza alto, con questo approccio potresti effettivamente superare la lunghezza massima di una riga di comando.

Il forciclo

for i in $(seq 100 100000); do rm fileName_$i; done

non soffre di questo problema, ma è un modo relativamente lento di eliminare i file, poiché la shell deve eseguire la sostituzione delle variabili e avviare rm circa 100.000 volte.

Entrambi i metodi sopra potrebbero causare avvisi se alcuni file, ad esempio, filename_101fossero mancanti.

Di solito, le soluzioni basate su findsono migliori, poiché funzionano solo su file che sono effettivamente lì (durante il rilevamento). Tuttavia, ci sono alcune sottili differenze:

find . -name 'fileName_[100-100000]' -exec rm {} \;

sarà ancora lanciare il rmprogramma di circa 100.000 volte, durante la sostituzione della finale \;da +cercherà di ridurre al minimo il numero di sottoprocessi. Entrambi i metodi saranno probabilmente (molto o un po ') più lenti dell'uso -deleteche non utilizza affatto comandi esterni ma invoca invece chiamate di sistema.

Tuttavia, controlla sempre prima se il modello corrisponde effettivamente ai file che desideri scegliere come target:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

Quindi in questo caso dovresti eliminare un file che desideri conservare e lasciare i file che avrebbero dovuto essere rimossi.


4

Utilizzare il comando seguente:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Ciò eliminerà i file da 100 a 100000.

Ulteriori informazioni: Sito


Faresti meglio ad usare +piuttosto che a \;- vedi qui . O, ancora meglio, usa il -deletecomando find .
evilsoup,

Ho provato questo e ha eliminato solo fileName_1. La [100-100000] classe di caratteri corrisponde solo a un singolo carattere, quindi può corrispondere solo a 0 o 1.
deltab
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.