Come posso eliminare tutti i file da una directory quando riporta "Elenco argomenti troppo lungo"


Risposte:


11

Nel caso in cui non sia possibile rimuovere la directory, è sempre possibile utilizzare find.

find . -maxdepth 1 -type f -exec rm -f {} \;

Ciò eliminerà tutti i file nella directory corrente e solo la directory corrente (non le sottodirectory).


quasi perfetto (vedi anche il mio post)
asdmin

2
Su Linux puoi farlo ancora più velocemente usando "+" invece di "\;". Ciò causerà la rimozione di più file per "rm" in una volta sola.
Thomas,

5
Ancora più veloce: find dir/to/delete -delete(non genera un rmprocesso per file da eliminare).
Morten Siebuhr,

Morten: Non ha mai menzionato il desiderio di eliminare la directory stessa, eh ha detto onky i file. find dir/to/delete -type f -delete
Richo,

21
trova . -maxdepth 1 -type f -exec rm -f {} \;

ci vuole semplicemente troppo tempo (un exec di rm per file).

questo è molto più efficiente:

trova . -maxdepth 1 -type f -print0 | xargs -r0 rm -f

dato che ci vogliono tanti nomi di file come argomenti per rm quanto è possibile, quindi esegue rm con il successivo carico di nomi di file ... può succedere che rm venga chiamato solo 2 o 3 volte.


5
Sono contento di vedere qualcuno sapere come funziona find ... Considera anche con il nuovo gnu find l'azione -delete o il comando -exec {} + che agisce come xargs. Vedi la sezione Azioni di 'man find'.
Kyle Brandt,

Non sapevo di -exec cmd {} +. Sembra piuttosto utile. Leggermente più generico di -elete :)
David Pashley,

-delete può andare bene, ma personalmente preferisco i comandi che possono essere usati su una varietà di macchine. I sistemi Solaris con cui lavoro sono più vecchi, quindi - l'eliminazione non funzionerebbe su di essi
asdmin

2
L'aggiunta ioniceappena prima rmè una buona idea se il computer viene utilizzato da altre persone contemporaneamente.
Hubert Kario,

6

Entrambi risolveranno il problema. C'è un'analisi delle rispettive prestazioni di ciascuna tecnica qui .

find . -name WHATEVER -exec rm -rf {} \;

o

ls WHATEVER | xargs rm -rf

Il problema deriva dall'espansione "*" di bash con l'elemento everysingle nella directory. Entrambe queste soluzioni funzionano invece attraverso ogni file.


2
La soluzione di ricerca è più lenta con molti file perché richiama il comando rm per ogni singolo file. La soluzione xargs è più veloce ma funziona solo quando i nomi dei file non contengono spazi (altrimenti è necessario trovare GNU e find . -print0 | xargs -0 rm).
robcast,

"find. -name WHATEVER -print0 | xargs -0 rm -rf" sarà più efficiente. find forcherà un rm per ogni file, dove xargs lo ridurrà al minimo. Hai bisogno di -print0 e -0 per far fronte ai file con spazi. Probabilmente vuoi anche usare -depth su find, quindi fa una prima ricerca approfondita.
David Pashley,

Il comando ls non funzionerà, poiché anche quello restituisce "lista argomenti troppo lunga"
Brent

2
Stai facendo " ls *" e il " *" si espande nella lista degli argomenti che la tua shell si lamenta di essere troppo lunga. Fai " ls ." invece (o sali di un livello di directory e fai " ls [dirname]").
James Sneeringer,

la seconda riga di comando (ls WHATEVER | xargs rm -rf) non funzionerebbe per lo stesso motivo per cui la domanda non funzionava: WHATEVER sarebbe stato sostituito da shell a una lunghezza superiore
asdmin

3

Sono stato in grado di farlo eseguendo il backup di un livello:

cd ..

E in esecuzione:

rm directory name -rf

E quindi ricreare la directory.


1
funziona solo se non è necessario avere la directory in modo permanente e tutti i file e le directory devono essere eliminati in modo ricorsivo. la maggior parte dei casi nella mia vita, in questo modo non avrebbe funzionato.
asdmin,

2

Tutte queste invocazioni sono molto belle, ma raramente ricordo esattamente la nomenclatura necessaria quando ho fretta: invece uso ls. Come qualcuno menziona, ls. funzionerebbe ma preferisco ls -1 come in:

ls -1 | xargs -n 100 rm -rf

La cifra -n xxx è abbastanza sicura da giocare poiché il superamento del massimo verrà corretto automaticamente (se viene superata la dimensione massima; vedere -s) o se viene superata l'args-max per un'app, di solito sarà piuttosto ovvio.

Va notato che grep è utile da inserire nel mezzo di questa catena quando si desidera eliminare solo un sottoinsieme di file in una directory di grandi dimensioni e non per qualsiasi motivo si desidera utilizzare find.

Questa risposta presuppone che tu stia utilizzando le utility di base di Gnu per ls, xargs ecc.


Funzionerà con una directory troppo grande perché "ls" funzioni? (stesso errore - elenco argomenti troppo lungo)
Brent

Sì, Brent: assicurati di non usare un filespec quando invochi ls. Usa solo -1 (trattino Uno) come mostrato sopra. E come spiegato sopra, usa grep dopo ls se devi abbinare l'elenco dei file. Se ricevi l'errore "troppo lungo" dopo esserti assicurato di non usare caratteri jolly con ls, forse xargs si sta lamentando. Usa 'xargs -n 5' invece di 'xargs -n 100' e dovresti sicuramente essere al sicuro, anche se un po 'più lento.
rixtertech,

1

È possibile utilizzare l' -exec +opzione per trovare quale tenterà di eseguire rm il minor numero di volte possibile, il che potrebbe essere più veloce.

find . -type f -exec rm '{}' +

0

Ecco una versione per l'eliminazione di un numero elevato di file quando il sistema deve rimanere reattivo.

Funziona emettendo lavoro in piccoli lotti (100 file per impostazione predefinita) e attendendo un po 'il completamento di altri lavori.

Ha funzionato brillantemente per la cancellazione di oltre mezzo milione di file da una singola directory su ext3. Stampa la percentuale fatta come un piccolo bonus

noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do 
   n=$((n+100));
   sync;
   echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
   sleep 5;
done

0

Risolve errori "argomento troppo lungo" o "impossibile allocare memoria"

Questo ha funzionato su oltre 220.000 file nella cartella della sessione ....

Vantaggio: inizia immediatamente a rimuovere i file

percorso cd / to / cartella
ls -f | xargs rm -f -v

FARE CLIC per lo screenshot dei file rimossi - (rimosso tutti i file in ~ 15min)

-f (dopo ls) continua a presortire

-v (dopo rm) visualizza ogni file come rimosso

-f (dopo rm) viene forzato senza prompt sui file protetti da scrittura

Suggerimento: rinominare prima la cartella (dalla sessione precedente a session_old) per evitare che vengano aggiunti altri file generati automaticamente mentre si tenta di eliminare i file. Puoi rifare manualmente la directory originale se non automaticamente come nel mio caso


Cosa c'è di nuovo nella tua risposta che mancava ai precedenti?
user2233709
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.