In Unix, come rimuovi tutto nella directory corrente e sotto di essa?


Risposte:


166

Fai pratica con il computing sicuro. Basta salire di un livello nella gerarchia e non utilizzare un'espressione con caratteri jolly:

cd ..; rm -rf -- <dir-to-remove>

I due trattini --indicano rmche <dir-to-remove>non è un'opzione della riga di comando, anche quando inizia con un trattino.


8
Perché è più sicuro?
Yen

34
Perché stai abbinando specificamente una directory con nome e quindi è meno probabile che elimini qualcosa che non intendi eliminare.
tvanfosson

5
Vero. Mi vedevo farlo abbastanza facilmente.
Yen

26
non cancella anche la directory stessa? In seguito devi eseguire mkdir <dir-to-remove>. Ma poi qualsiasi collegamento fisico che fa riferimento a quella directory sarà successivamente una directory distinta.
Johannes Schaub - litb

5
@Yen, se usi rm ./potresti scrivere accidentalmente rm . /che potrebbe essere un disastro.
irfandar

44

Eliminerà tutti i file / directory sotto quella corrente.

find -mindepth 1 -delete

Se vuoi fare lo stesso con un'altra directory di cui hai il nome, puoi semplicemente nominarla

find <name-of-directory> -mindepth 1 -delete

Se vuoi rimuovere non solo le sue sottodirectory e file, ma anche la directory stessa, ometti -mindepth 1. Fallo senza -deleteper ottenere un elenco delle cose che verranno rimosse.


Avevo bisogno di eliminare tutti i file nelle sottodirectory, ma non volevo eliminare le sottodirectory stesse. find <name-of-direcotry> -mindepth 2 -delete ha funzionato alla grande!
Tim Dearborn

È necessario -mindepth 1se si specifica una directory ( find <name-of-directory> -mindepth 1 -delete). Altrimenti Johannes ha ragione, non cancellerà la directory di lavoro corrente (durante l'utilizzo find -delete).
Weboide

IMO, questa è la risposta migliore, in particolare negli script.
wizonesolutions

1
Ho provato: find -mindepth 1 -deletema ho ottenuto illegal option -- mma ha funzionato alla grande quando ho rimosso l'opzione Mindepth find . -delete
Sharon

41

Quello che faccio sempre è digitare

rm -rf *

e poi premi ESC- * , e bash espanderà * in un elenco esplicito di file e directory nella directory di lavoro corrente.

I vantaggi sono:

  • Posso rivedere l'elenco dei file da eliminare prima di premere INVIO.
  • La cronologia dei comandi non conterrà "rm -rf *" con il carattere jolly intatto, che potrebbe quindi essere riutilizzato accidentalmente nel posto sbagliato al momento sbagliato. Invece, la cronologia dei comandi conterrà i nomi dei file effettivi.
  • È anche diventato utile una o due volte rispondere "aspetta un secondo ... quali file ho appena cancellato?". I nomi dei file sono visibili nel buffer di scorrimento del terminale o nella cronologia dei comandi.

In effetti, mi piace così tanto che l'ho impostato come comportamento predefinito per TAB con questa riga in .bashrc:

bind TAB:insert-completions

Manca --in questa risposta? Questo approccio è fantastico nel complesso, devo dire.
Ben Voigt

il modo migliore è eseguirlo con sudo
Abbas Torabi

22

Uso

rm -rf *

Aggiornamento: .sta per directory corrente, ma non possiamo usarlo. Il comando sembra avere controlli espliciti per .e ... Usa invece il carattere jolly globbing. Ma questo può essere rischioso.

Una versione più sicura IMO è usare:

rm -ri * 

(questo richiede una conferma prima di eliminare ogni file / directory.)


13
"Può essere rischioso" è meravigliosamente laconico.

5
Quando si fanno cose come questa, ho trovato un rapido ls -r. per prima cosa ti consente di vedere cosa vuoi eliminare. Utile per dare una rapida idea che non cancellerai l'intero disco ...
Rich Bradshaw

2
Perché è più rischioso di rm -rf <subdir-name>?
Yen

2
@Yen - perché se lo fai nel posto sbagliato puoi ottenere risultati disastrosi. L'uso di un nome specifico nel posto sbagliato può andare storto solo se la stessa sottodirectory esiste lì.
tvanfosson

1
Non puoi cancellare il genitore mentre risiedi nel bambino.
Direttamente

6

È corretto che rm –rf .rimuoverà direttamente tutto ciò che è presente nella corrente, comprese eventuali sottodirectory e il loro contenuto. Il punto singolo ( .) indica la directory corrente. fare attenzione a non farlo rm -rf ..poiché il doppio punto ( ..) indica la directory precedente.

Detto questo, se sei come me e hai più finestre di terminale aperte allo stesso tempo, faresti meglio a stare al sicuro e usa rm -ir .Guardiamo gli argomenti del comando per capire perché.

Primo, se guardi la rmpagina man dei comandi ( man rmsotto la maggior parte di Unix) noterai che –rsignifica "rimuovere il contenuto delle directory ricorsivamente". Quindi, fare rm -r .da solo cancellerebbe tutto nella directory corrente e tutto ciò che si trova sotto.

Nella rm –rf .-f aggiunta significa "ignora i file inesistenti, non chiedere mai". Quel comando elimina tutti i file e le directory nella directory corrente e non ti chiede mai di confermare che vuoi davvero farlo. -fè particolarmente pericoloso se esegui il comando con un utente con privilegi poiché potresti eliminare il contenuto di qualsiasi directory senza avere la possibilità di assicurarti che sia davvero quello che vuoi.

Sul otherhand, nel rm -ri .l' -iche sostituisce i -fmezzi "pronta prima di ogni rimozione". Ciò significa che avrai la possibilità di dire "oups! Non è quello che voglio" prima che rm elimini felicemente tutti i tuoi file.

Nei miei primi giorni di amministratore di sistema ho fatto un rm -rf /su un sistema mentre ero connesso con tutti i privilegi (root). Il risultato sono stati due giorni trascorsi a ripristinare il sistema dai backup. Ecco perché ora lavoro rm -riadesso.


6

Che ne dite di:

rm -rf "$(pwd -P)"/* 

27
jQuery è così potente.
Pawel

5
rm  -rf * 

Non farlo! È pericoloso! ASSICURATI DI ESSERE NELLA DIRECTORY GIUSTA!


4

rendere sicuro ci si trova nella directory corretta

rm -rf *

2
Ciò non elimina i file o le sottodirectory il cui nome inizia con un punto.

1
vero. nei miei test, nemmeno rm -rf. tvanfosson ha la migliore soluzione IMO con il suo "cd ..; rm -rf <dir-to-remove>"
digitaljoel

2

Questa più semplice soluzione sicura e generale è probabilmente:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

1

Credo che questa risposta sia migliore:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Se viene chiamata la directory di primo livello images, eseguire rm -r images/*. Questo utilizza l'operatore glob della shell *per eseguire rm -rsu ogni file o directory all'interno delle immagini.

fondamentalmente si sale di un livello e quindi si dice elimina tutto nella directory X. In questo modo stai ancora specificando quale cartella dovrebbe avere il suo contenuto cancellato, il che è più sicuro che dire semplicemente "elimina tutto qui", preservando la cartella originale, (cosa che a volte vuoi perché non sei autorizzato o semplicemente non vuoi per modificare le autorizzazioni esistenti della cartella)

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.