Come rimuovere tutti i file in una directory?


76

Sto cercando di rimuovere tutti i file e le sottodirectory in una directory. Ho usato rm -rper rimuovere tutti i file, ma voglio rimuovere tutti i file e le sottodirectory, esclusa la directory principale stessa.

Ad esempio, ho una directory superiore come images. Esso contiene i file header.png, footer.pnge una sottodirectory.

Ora voglio eliminare header.png, footer.pnge la sottodirectory, ma non images.

Come posso farlo in Linux?


1
cd nella directory ed esegui uno rm -Rfdi tutti i file e le directory presenti.
Noufal Ibrahim,

Risposte:


59

Se viene chiamata la directory di livello superiore images, quindi esegui rm -r images/*. Questo utilizza l'operatore shell glob *per essere eseguito rm -rsu ogni file o directory all'interno images.


30
il file nascosto non verrà eliminato.
reto,

51

Per eliminare i file nascosti, è necessario specificare:

rm -r images/* images/.*

Con conchiglie i cui globs includono .e .., questo porterà ad un errore simile

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

ma eliminerà i file nascosti.

Un approccio senza errori consiste nell'utilizzare find / delete con mindepth. Questo è gnu-find.

find images -mindepth 1 -delete

La tua ricerca potrebbe non avere il predicato -mindeptho -delete, in tal caso, potresti fare:

find images/. ! -name . -prune -exec rm -rf {} +

Il mio suggerimento era di usare 'rm -r images /.*' che corrispondesse a 'images / ..' ma non a 'images /../ ..'. La ricorsione non può andare verso l'alto, poiché 'images /../ images / ..' è di nuovo la stessa directory.
utente sconosciuto

4
@DarkHeart rm .*non cancella .o ..e non esiste almeno dal 1994 per i programmi GNU e probabilmente dalla fine degli anni '70 per UNIX . È estremamente improbabile che trovi un sistema in cui rm .*attraversa il filesystem verso l'alto al di fuori di un museo.
terdon

21

Per eliminare tutti i file e le directory (inclusi quelli nascosti ) in una directory, puoi provare quanto segue:

  • utilizzare ls -Abper abbinare tutti i file / directory

    cd dir_name && rm -rf `ls -Ab`
    
  • utilizzare findper abbinare tutti i file / directory

    find dir_name -mindepth 1 -delete
    

    o, se il tuo findnon supporta -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • eliminare la cartella, quindi ricrearla

    rm -rf dir_name && mkdir dir_name
    
  • in bash,

    shopt -s dotglob  
    rm -rf dir_name/*
    

Si noti che il comando like rm -rf *non è sicuro se non si ha conoscenza dei file in una directory, perché un file che inizia con -(trattino) verrà interpretato come rmflag ...
VasyaNovikov

1
EDIT: per farlo in sicurezza, usarm -rf ./* ./.*
VasyaNovikov

9

Per eliminare tutti i file regolari ricorsivamente all'interno di una directory, questo comando (supponendo GNU o FreeBSD find) è abbastanza buono:

find . -type f -delete

Ciò lascia tutti i file non regolari come collegamenti simbolici (che puntino a file regolari o meno), directory, fifo, socket, dispositivi ...

Guarda anche:

find . ! -type d -delete

per eliminare file di qualsiasi tipo tranne la directory .


6

Prova questa versione:

 rm -r test/*

1
Questo non rimuoverà i file nascosti (quelli che iniziano con ".").
gbmhunter

3

Sto usando il findcomando qui:

Passaggio 1: trova tutti i file ed eliminali:

find /path/to/directory/ -type f -exec rm {} \;

Esempio:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Passaggio 2: trova tutte le sottodirectory ed eliminale:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dinclude .quindi eliminerà la directory stessa. È inoltre necessario utilizzare l' -mindepthinterruttore come altri hanno già detto.
Arthur Tacca,

3

La domanda era svuotare una directory = rimuovere il contenuto di una directory inclusi i file nascosti, ma non la directory stessa. Il comando find con -mindepth 1 è in realtà il modo corretto di procedere, ma per evitare messaggi di errore deve essere unito a -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

La sintassi di rm è:

rm [OPTION]... FILE...

Quindi, è necessario indicare esplicitamente il percorso appropriato, ad es

rm -r sub_dir/

0

Puoi rimuovere la directory usando il seguente comando:

sudo rm -r directoryname1/2/3/*

Verrà eliminata l'intera directory dopo 3 / *.

Esempio sudo rm -r Download / brano / *

Verranno eliminati tutti i file che si trovano all'interno Downloads/song.


0

Questo funziona perfettamente per me, testato diverse varianti funzionanti ogni volta.

Dalla directory che contiene la directory delle immagini.

rm -frd ./images/*

prima:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

dopo:

images/

Non sono sicuro che sia stato chiarito nella domanda originale, ma solo per sottolineare che a meno che non si abiliti dotglob, questo salterà qualsiasi "file-punto" o directory-punto sotto le immagini ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller

0

Per eliminare tutti i file e le sottodirectory nella directory corrente, inclusi quelli nascosti, senza messaggio di errore :

rm -rf .[^.] .??* *

Oppure, dalla directory principale:

rm -rf images/.[^.] images/.??* images/*

Da https://serverfault.com/a/47940/269538 .



-2

Elimina la cartella "test" e tutti i file all'interno:

 rm -r test

Elimina tutti i file all'interno ma mantieni la cartella "test":

 rm -r test/*

-4

cd nella cartella, quindi eseguire il comando seguente:

ls |xargs rm -rf

2
Questo fallirà nei nomi di file che contengono spazi bianchi. Consiglierei di non utilizzare l'output di ls come input per altri comandi, in genere non è sicuro.
Dhag,
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.