Come rimuovere solo il contenuto delle directory?


14

Sono in una cartella: /var/myfolder.

All'interno ci sono alcune altre cartelle come: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/ecc.

All'interno di ognuno ci sono alcuni file con nomi casuali. Come rimuovo tutti i file da tutte le cartelle all'interno /var/myfolder?

La struttura (tutte le directory, ad es. A, B, C ecc., All'interno /var/myfolder) dovrebbe rimanere intatta.

Risposte:


17

Provare:

find /var/myfolder -type f -delete

Questo porta tutti i file normali in / var / myfolder e li elimina lasciando solo le directory.


Grazie per la soluzione Avrei dovuto menzionare che lo sto facendo in Solaris 9, quindi la mia ricerca non ha l'opzione -delete, ma è un buon punto di partenza.
IroeN,

2
Sono stato in grado di trovare una seguente soluzione: find / var / myfolder -type f -exec rm -f {} \;
IroeN,

2
Scusa. Uso Debian o Ubuntu. La tua soluzione è equivalente per quanto ne so.
StarNamer,

6
-type f! =! -type d
mikeserv il

7

Con zsh, usa il . qualificatore glob per abbinare solo i file normali:

rm -- **/*(.)

Ciò elimina in modo ricorsivo tutti i file regolari (non nascosti) nella directory corrente e nelle sue sottodirectory. Aggiungi il Dqualificatore glob per eliminare anche i file regolari nascosti (e i file regolari nelle directory nascoste).


Sto usando bash.
IroeN,

1
@ user6554: ... che né la tua domanda né i tag usati indicano;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm non rimuove le directory, quindi eseguilo su tutto.

Per conservare i collegamenti simbolici alle directory:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

E penso che questo dovrebbe funzionare anche, forse, in modo leggermente ottimizzato se ci sono molti file che potrebbero aver bisogno di essere testati nella versione precedente:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

Nota che GNU findha -xtypeun'opzione per questo.
Stéphane Chazelas,

@ StéphaneChazelas - anche ast. ma non avevo bisogno di nulla di profondo, non credo. l'ho tenuto in cima per evitare così tante chiamate di errore - silenziate o meno - ma era semplicemente sciocco nelle altre.
Mikeserv,

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

Eliminerà tutto all'interno delle sottocartelle senza toccare le stesse sottocartelle.

Il primo *è per le sottodirectory di myfoldersé ( A, B, ...). Il secondo *è per i file in A, Becc

Se ci sono più cartelle all'interno A, Becc Prima esecuzione: rm /var/myfolder/*/*/*quindi eseguire rm /var/myfolder/*/*.


0

Dovresti anche essere in grado di eseguire il cd nella parte superiore dell'albero delle directory in questione, quindi eseguire:

find . -type f -print0 | xargs -0 rm -rf

e ciò dovrebbe eliminare tutti i file lasciando intatto l'albero delle directory. Le opzioni -print0 e -0 possono essere omesse se si è certi di non avere nomi di file o directory che contengono spazi.

Il comando find distingue tra file (-type f) e links (-type l), quindi questo dovrebbe lasciare intatti i link, se presenti. Non testato però. In caso di dubbi, eseguire:

trova . tipo l

e vedere se viene visualizzato qualcosa prima di eseguire il comando find precedente.


Puoi spiegare come si inserisce la rmbandiera -r, -R, --recursive - remove directories and their contents recursivelyin questo?
Stephen Rauch,

Poiché non stiamo eseguendo rm -rf, stiamo eseguendo find. -tipo f e quindi convoglia l'output da quello a rm -rf. Quindi rimuove solo i file, non tocca le directory. Ecco cosa | xargs bit lo fa, prende l'output dal comando a sinistra e lo invia al comando a destra.
rjh427,

Esattamente il mio punto. Se non si passa alcuna directory, a che serve un flag che funziona solo su directory?
Stephen Rauch,

Perché la memoria muscolare, e funziona ancora. Potresti sollevare la stessa obiezione sull'opzione -f "force", ti darei la stessa risposta.
rjh427,

-2

Usa semplicemente il comando seguente:

sudo rm -rf directory_in_which_you_have_content / *

---------------- O --------------------------------- -----------------------

'*' Sta per tutti quindi quando userai * che cancellerà tutto il contenuto. quindi usa il comando in questo modo o vai nella directory in cui vuoi eliminare tutto il contenuto e usa il comando seguente:

sudo rm -rf *

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.