Come rimuovere tutti i file e le sottodirectory in una directory SENZA eliminare la directory in bash?


53

Esiste un comando per rimuovere tutti i file e le sottodirectory in una directory SENZA eliminare la directory?

Ad esempio, se ho la directory "dontDeleteMe" con le sottodirectory "1", "2", "3" e ogni sottodirectory contiene alcune immagini, come posso rimuovere le sottodirectory "1", "2" e "3" e tutti i file in essi contenuti, senza rimuovere la directory principale "dontDeleteMe"?

Risposte:


66

Per rimuovere tutto in una directory senza rimuovere la directory, digitare:

rm -rfv dontDeleteMe/*

Si prega di notare che la /*parte è molto importante. Se si inserisce uno spazio prima di *, eliminerà tutti i file nella directory corrente.

Inoltre, stai molto attento a giocare rm, -re *tutti con lo stesso comando. Possono essere una combinazione disastrosa.

Aggiornamento: Ok, ho capito se hai file nascosti / punti [nomi di file con punti all'inizio, ex .hidden], questo lascerà intatti quei file.

Quindi davvero, la soluzione più semplice alla domanda originale è: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Un altro sarebbe usare findl' -execopzione o il pipe per xargs(sotto):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


Puoi fare un esempio dell'uso di xargs? Che cos'è xargs?
justingrif,

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv credo che nella maggior parte dei casi funzionerà, indipendentemente dagli spazi e cosa no. Ma cd to /tmp/e creare una directory di prova e provarlo. :)
Matt,

Oh, e dalla manpage: "xargs - crea ed esegue le righe di comando dall'input standard"
Matt,

5
Ri-creare una directory non equivale a cancellare il suo contenuto. ad esempio differenze di autorizzazione nella directory umask, differenze del proprietario, ecc ... la risposta di enzotib risolverebbe i problemi con la sintassi originale

3
Questa non è una buona risposta L'uso di * è pericoloso e non funzionerà su file dot senza "dotglob" (vedi sotto). rm -rf dontDeleteMe && mkdir dontDeleteMenon garantisce che la directory venga ricreata con gli stessi permessi / proprietari. Utilizzare invece una delle find dontDeleteMe/ -mindepth 1 -deletevarianti seguenti.
Nils Toedtmann,

27

L'unico motivo per cui rm -r ./*non sempre funziona è che puoi avere file e / o cartelle nascosti che non corrispondono *.

A tal fine, bashfornisci un'opzione per *abbinare tutto, anche gli oggetti nascosti:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Può essere utile ripristinare il dotglobsuo stato predefinito (non impostato), se si continua a utilizzare la shell in cui sono stati eseguiti i comandi precedenti:

shopt -u dotglob 

Inoltre, non può funzionare quando hai un gran numero di file
S ..

23

Apri il terminale ( Ctrl+ Alt+ T) e scrivi questo:

find somedir -mindepth 1 -delete

Questo abbinerà tutti i file e le directory all'interno somedire i suoi (nipoti) figli inclusi i file di punti "nascosti" ma escludendo somedirse stesso a causa di -mindepth 1, quindi -deleteloro.


Benvenuto in AskUbuntu! Mentre la tua risposta potrebbe potenzialmente aiutare il poster originale, la mancanza di informazioni per spiegare cosa farebbe per aiutarlo a rendere la tua risposta incompleta.
Oyibo,

3
Manca di spiegazione, ma rimane la risposta migliore. Funziona anche in OSX (tranne per il modo di aprire Terminal, ovviamente).
noamtm,

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Utilizzare l' xdevopzione per eliminare i file solo entro i limiti del dispositivo.


GNU find ha -delete. Implica -depthed è più facile da ricordare di-depth -exec rm -Rf {} \;
Nils Toedtmann,

4

Per eliminare (nel terminale) tutti i file e le sottodirectory ad eccezione della directory di base denominata "dontdelete":

rm -rf dontdelete/*

Questo non elimina i file nascosti, quindi "tutti i file" potrebbe essere un'istruzione troppo in grassetto.
Stefan van den Akker,

4

Puoi usare findcon la -deletebandiera:

find dontDeleteMe/* -delete

Il /*è importante, poiché dice finddi cercare solo all'interno della cartella chiamata "dontDeleteMe".

Assicurati anche che la -deletebandiera sia alla fine del findcomando.


1
Questa soluzione non elimina alcun file nascosto, a meno che tu non lo abiliti dotglob. Altrimenti, l'uso -mindepth 1dell'opzione flag sembra l'unico modo per farlo funzionare.
Stefan van den Akker,

3
rm -rf  directory/{.*,/*}

Cosa dice:

Rimuovi tutti i file che iniziano con. in "directory" e anche tutti gli altri file.

Anche se, come notato da Neftas, questa soluzione non è sicura!

La soluzione più sicura è:

 rm -rf directory/!(.|..)

Questo comando potrebbe essere potenzialmente pericoloso, dal momento che si sta anche compresi .e ..le directory. Questo può essere evitato cambiando {.*}in {.??*}, ma non eliminerai i file nascosti con un solo carattere, ad esempio .a.
Stefan van den Akker,

di cosa si tratta? rm -rf directory /! (. | ..)
Tebe

Sembra una soluzione molto migliore di quella che mi è venuta in mente. Posso suggerirti di modificare la tua risposta?
Stefan van den Akker,

suggerimento accettato)
Tebe,

1

Non sono sicuro del perché sia ​​così complesso, aiutami se sbaglio

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Questo è tutto


Questo ha il piccolo difetto di provare a cancellare anche la directory corrente, che, ovviamente, non funziona, perché è ancora in uso come directory di lavoro della shell che invoca.
David Foerster,

1

C'è una risposta ancora più semplice:

  1. cd dontDeleteMe

  2. rm -rf *

Tempo di lezione di base per l'amministrazione del sistema: assicurati di prestare attenzione a dove ti trovi quando usi i comandi di scorrimento come questo.

Non posso dirlo abbastanza. Ho dovuto recuperare una casella perché qualcuno non prestava attenzione e digitava rm -rf *mentre era in /.

* nix presuppone che se sei root o se stai facendo il root come root sai cosa stai facendo. Quindi assicurati di sapere cosa stai facendo prima di farlo.

Un'alternativa che assicura che il comando 'cd' funzioni prima di emettere 'rm' è l'uso

cd dontDeleteMe && rm -rf *

6
Questo è un suggerimento pericoloso. Quello che vuoi è: cd dontDeleteMe && rm -rf *
Izkata,

@Izkata Oppure assicurati che l'operazione cd sia andata a buon fine, prima di eseguire il comando rm.
Eliah Kagan,

1
@EliahKagan Questo è esattamente ciò che fa il mio frammento di codice ...
Izkata,

In realtà non è più o meno pericoloso di quello che suggerisci. Tutto ciò che fa && è di concatenare i due comandi in modo da eseguirli contemporaneamente. Semmai il mio metodo è effettivamente PIÙ SICURO poiché devi fermarti e .look prima di eseguire rm -rf *. Fare una pausa per ricontrollare è sempre meglio.
user30619

5
@ user30619 L' &&operatore non si limita a concatenare i comandi; richiede che ciascun comando abbia esito positivo prima che quello successivo venga eseguito. Se il cdcomando non riesce per qualsiasi motivo (directory non esistente, privilegi, ecc.), Il rmcomando non verrà eseguito. Lo definirei più sicuro.
ean5533

0
  1. La cosa più semplice per me: un esperto di Windows ma un principiante di Ubuntu
  2. Fai clic sull'icona File nel programma di avvio
  3. Passare alla directory in cui si trovano i file e le cartelle che si desidera eliminare
  4. Fare clic destro in un'area vuota della finestra accanto ai file e fare clic su "Apri in Terminale" - lasciare aperta la finestra File
  5. Si aprirà una finestra di terminale che verrà "impostata" sulla cartella individuata
  6. Puoi digitare "dir" (ignora le virgolette quando dico tipo) e premi invio per il terminale per mostrare un elenco di file e cartelle - solo per dimostrare che sei "nella" cartella giusta
  7. digitare "rm -rf *" e premere invio
  8. a seconda della dimensione delle cartelle / file per eliminare il sistema verrà messo in pausa
  9. Quando il prompt del terminale ritorna, la finestra File che hai aperto ora dirà "La cartella è vuota"
  10. Ho avuto successo con questo metodo e mi ha dato conforto vedere i file / la cartella sia nella finestra File che come risultato del comando Dir nella finestra del terminale
  11. Mi ha anche confortato il fatto che la finestra File mostrasse la cartella ora vuota, specialmente da quando stavo inseguendo questi file cercando la cartella cestino in cui si trovavano
  12. Grazie a tutti coloro che hanno inviato le risposte: è stato molto istruttivo

Sembra piuttosto contorto, soprattutto perché finirai per correre rm -rf *comunque.
David Foerster,

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.