Ho una directory con un paio di centinaia di migliaia di file.
Voglio eliminare tutti i file, ma rm * -f riporta: "lista argomenti troppo lunga"
Qual è il modo migliore per cancellare questa directory?
Ho una directory con un paio di centinaia di migliaia di file.
Voglio eliminare tutti i file, ma rm * -f riporta: "lista argomenti troppo lunga"
Qual è il modo migliore per cancellare questa directory?
Risposte:
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).
find dir/to/delete -delete
(non genera un rm
processo per file da eliminare).
find dir/to/delete -type f -delete
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.
ionice
appena prima rm
è una buona idea se il computer viene utilizzato da altre persone contemporaneamente.
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.
find . -print0 | xargs -0 rm
).
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]
").
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.
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.
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
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