Come rimuovere tutti i file da una directory?


289

Il più vicino che ho ottenuto è

# rm /path/to/directory/*.*

ma questo non funziona per i file che non hanno un'estensione ...

Risposte:


340

Linux non utilizza estensioni. Spetta al creatore del file decidere se desidera che il nome abbia un'estensione. Linux osserva il primo byte per capire con quale tipo di file ha a che fare.

Per rimuovere tutto in una directory utilizzare:

rm /path/to/directory/*

È possibile utilizzare l' -ropzione, ad esempio:

rm -r /path/to/directory/*

per rimuovere anche eventuali sottodirectory (insieme a tutto il loro contenuto) all'interno della directory di cui si sta rimuovendo il contenuto. Altrimenti mostrerà un errore che ti informa che non sta rimuovendo la directory.


13
Se vuoi anche eliminare i file nascosti esegui shopt -s dotglobprima di eseguirlorm (...)
danjjl

7
* Significa all files;) *.*indica tutti i file che contengono un punto .nel nome
Rinzwind

10
@Rinzwind, più precisamente, l'asterisco significa "zero o più di qualsiasi carattere". Quindi *a*significa zero o più caratteri, seguito da aseguito da zero o più caratteri. Sarebbe abbinare i nomi dei file happy, apple, ao la.
DisgruntledGoat

7
@ user784637 sei troppo facilmente impressionato
barlop

1
Ecco il comando che vuoi: rm - *
anon58192932

168
  • Per rimuovere la cartella con tutto il suo contenuto ( comprese tutte le cartelle interne ):

    rm -rf /path/to/directory
    
  • Per rimuovere tutto il contenuto della cartella ( comprese tutte le cartelle interne ) ma non la cartella stessa:

    rm -rf /path/to/directory/*
    

    o

    rm -rf /path/to/directory/{*,.*}
    

    se si desidera assicurarsi che anche i file / le directory nascosti vengano rimossi.

  • Per rimuovere tutti i "file" dall'interno di una cartella ( non rimuovere le cartelle interne ):

    rm -f /path/to/directory/{*,.*}
    


  • Attenzione : se hai spazi nel tuo percorso, assicurati di usare sempre le virgolette.

    rm -rf /path/to the/directory/*
    

    equivale a 2 rm -rfchiamate separate :

    rm -rf /path/to
    rm -rf the/directory/*
    

    Per evitare questo problema, puoi usare 'virgolette singole '( non espande le variabili della shell) o "virgolette doppie "( espande le variabili della shell):

    rm -rf "/path/to the/directory/"*
    


Dove:

  • rm- sta per " rimuovi "
  • -f- sta per " forza " che è utile quando non si desidera che venga richiesto / richiesto se si desidera rimuovere un archivio, ad esempio.
  • -r- sta per " ricorsivo ", il che significa che si desidera andare in modo ricorsivo in ogni cartella e rimuovere tutto.

8
Ho trovato che questa è la risposta più completa e utile, oltre alla risposta contrassegnata come accettata.
inspirednz,

2
rm -rf /path/to/directory/*non rimuove un file nascosto nella cartella ad es .htaccess. Forse rm -rf /path/to/directory/.? Non l'ho provato.
Mark Berry,

@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru

@ LilianA.Moraru, ho fatto alcuni test oggi. rm -rf /path/to/directory/.*elimina solo i file nascosti nella directory specificata. Guardando il commento di @ danjjl sulla risposta di @ Rinzwind, per eliminare anche i file nascosti, esegui shopt -s dotglobprima di eseguire rm -rf /path/to/directory/*.
Mark Berry,

ATTENZIONE: rm -rf /path/to/directory/.*sul mio sistema ha causato la cancellazione di elementi in /path/to. Fortunatamente, avevo appena eseguito il backup di tutti i miei dati su un disco separato. Inutile dire che NON emettere il comando a rm -rf /path/to/directory/.*meno che non sia stato eseguito il backup dell'intero computer in una posizione separata / sicura!
elenco delle leggi

43

Per rimuovere tutti i file nella directory (inclusi i file nascosti e le sottodirectory) eseguire:

rm -rf /path/to/directory/{*,.*}

1
Questa dovrebbe essere la bella risposta accettata. Grazie!
Nam G VU,

3
Questo glob non corrisponde a "." e anche?
hertzsprung,

4
@hertzsprung: lo fa e ti avviserà che non è possibile eliminare ./e ../, ma eliminerà comunque i file nascosti.
Ryan Wheale,

Questo non funziona sulla console Mac, i file nascosti sono ancora lì con quella riga di comando.
agapitocandemor,

Per rimuovere tutto l'attuale directory:rm -r $(pwd)/{*,.*}
Jimmy Adaro

10

Se vuoi eliminare solo i file nella directory / path / to / puoi farlo

find /path/to/directory -type f -print0| xargs -0 rm 

o

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

Puoi fare carichi con find, il vantaggio è che puoi elencare ciò che viene trovato senza eseguire il piping in rmmodo da poter vedere cosa verrà eliminato prima di iniziare.


2
GNU findcome -deletepredicato. Se si desidera ancora utilizzare -exec, la sostituzione \;con +raccoglierà le rmchiamate, aumentando l'efficienza.
enzotib,

1
una grande quantità di file con '+' causerà problemi, poiché l'elenco sarà troppo grande, come rm -f *. e quando si rimuovono grandi quantità di file dalla stessa cartella (parlando in milioni) entrambi non sono buoni :) Alla fine C ++ è arrivato e ha rimosso i file in ordine di inode in dir-tree.
Osis,

3
Dovresti davvero aggiungere un - dopo l'rm. Senza di ciò se si dispone di un nome file -rf o simile verrà interpretato come argomento per rm. ad esempio xargs -0 rm - o -exec rm - {} \;
Richm,

puoi anche fornire l'argomento -n a xargs. Ciò causerà la divisione dei comandi rm in modo da avere un numero massimo di argomenti, ad esempio 'xargs -n 100 -0 rm -' rimuoverà i file in blocchi di 100.
Richm

1
È inoltre possibile aggiungere -maxdepth 1 per assicurarsi che find non restituisca file da alcuna sottodirectory. vale a dire find / path / to / directory -maxdepth 1 -type f
Richm

7

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

  • eliminare la cartella, quindi ricrearla

    rm -rf dir_name && mkdir dir_name
    
  • uso find

    find dir_name -mindepth 1 -delete  
    

Qui specifichiamo -mindepth 1di escludere la directory dir_name stessa.
Dai un'occhiata al seguente link:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


Grazie per il tuo consiglio e ho aggiunto ulteriori spiegazioni per i collegamenti.
zeekvfu,

3
Fai attenzione, poiché eliminare e ricreare la cartella potrebbe comportare autorizzazioni diverse / errate per questa cartella!
einjohn,

6

Se si desidera rimuovere anche tutte le sottodirectory e la directory stessa, è possibile utilizzare rm -rf /path/to/directory. Ma ricontrolla sempre la tua linea prima di premere rm -rfInvio , può anche causare un sacco di confusione, ad esempio se inserisci accidentalmente uno spazio dopo la prima barra mentre hai le autorizzazioni del superutente ...


1

Poiché questa domanda è costantemente al top di Google quando cerco questo da solo:

Le altre risposte soffrono di diversi problemi:

  1. Alcuni di essi includono .e ..che è rumoroso, confuso e fastidioso.

  2. Alcuni dimenticano i file nascosti (file che iniziano con un punto).

  3. Non vengono eliminati in un ordine (il più profondo) corretto per consentire l'eliminazione della directory.

  4. Discendono in altri file system (montati), che spesso sono indesiderati.

  5. Sono difficili da estendere correttamente con parametri extra (più su quello sotto).

Quindi, per cancellare RECURSIVAMENTE tutti i file E le cartelle in una directory, procedere come segue:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Si noti che ho aggiunto un -xdevargomento per impedire la discesa in mount (come /procecc.).

Perché no -deptho -delete?

Nonostante la gente mi voti costantemente per questo, questi metodi hanno un rovescio della medaglia: non sembra che siano abbastanza estensibili per consentire la -prunecreazione di una sottodirectory (senza introdurre più problemi). Contrariamente a questo metodo, è possibile inserire

-not \( -path "${DIR}/subdir" -prune \)

prima -mindepthdell'argomento da escludere subdirdall'aver cancellato il suo contenuto.


E per il primo ordine di profondità, c'è una -depthbandiera findper quello.
Sergiy Kolodyazhnyy,

Uh ... perché non utilizzare -deleteconfind ? -deleteè il primo in profondità. Stai già assumendo non POSIX findcon il -printf, quindi potresti anche usare -deleteo-depth -print0 | xargs -0 rm
muru

@muru: Perché non sapevo di meglio ... Lo cambierò.
Mehrdad,

@muru: In realtà, sembra che il tuo metodo non funzioni con -not \( -path "$DIR/subdir" \)... ma il mio funziona? Perché?
Mehrdad,

@Mehrdad che cosa dovrebbe fare?
Muru,

0

Puoi cdentrare nella directory e quindi eseguire il comando rm *.*proprio come in DOS, se ricordi.


1
DOS è DEL per i file e RMDIR per le directory vuote e i file nascosti e di sistema devono prima rimuovere quegli attributi ATTRIB. Non altrettanto semplice;)
Eric

0

Per eliminare la directory corrente, è possibile ad esempio utilizzare rm -d ./*

-d dice di cancellare anche le directory.

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.