Come eliminare solo i file, ma mantenere la struttura della directory?


16

Vorrei eliminare ogni file, ma mantengo la struttura delle cartelle. C'è un modo?

NOTA: (sto usando GNU bash 4.1.5).


1
Come intendi esattamente "escludere"? Stai usando un comando di qualche tipo? In tal caso, aggiorna la tua domanda per includerla.
slm


Penso che intendi cancellare ogni file.
slm

1
@slm Ho aggiornato con il comando che di solito utilizzo per escludere i file.
Tom Brito,

No, non l'hai fatto :-) Oppure, se l'hai fatto, l'hai rimosso di nuovo
Mawg dice di ripristinare Monica il

Risposte:


17

Prova questo:

find . ! -type d -exec rm '{}' \;

Ciò eliminerà ogni singolo file, escluse le directory, sotto la directory di lavoro corrente. Stai estremamente attento con questo comando.

Se la versione di findsulla tua macchina lo supporta, puoi anche usare

find . ! -type d -delete

@slm: non sono sicuro di quanto sia portatile. L'ho aggiunto come opzione secondaria. Mi sono appena reso conto che la mia modifica ha reso la mia risposta praticamente identica alla tua. Mi dispiace per quello; non era il mio intento.

'{}' Protegge dagli spazi nei file? Ti vedo usare tutto il tempo e non credo di averlo mai visto usato prima di vederti pubblicare soluzioni con esso.
slm

Dalla pagina man di GNU find: "Notare che le parentesi graffe sono racchiuse tra virgolette singole per proteggerle dall'interpretazione come punteggiatura di script shell". Non sono sicuro quando è necessario però. Lo faccio principalmente per abitudine. Il findcomando non vede mai le virgolette. Vede solo il {}marcatore come argomento.

Lo vedo nell'esempio, ma i modelli mostrano questo " -exec command {} +" & this " -exec command ;". Ho usato il \;in passato semplicemente mai il '{}'.
slm

@slm: I modelli inoltre non mostrano l'escaping del punto e virgola, che è generalmente necessario quando si utilizza una shell per l'esecuzione find. Penso che i modelli findabbiano lo scopo di mostrare quali argomenti sono necessari al comando e non preoccuparti di nulla relativo alla shell.

7

È possibile utilizzare il comando findper individuare ogni file ma mantenere la struttura della directory:

$ find /some/dir -type f -exec rm {} +

Per questo domande e risposte su Unix e Linux intitolate: gnu trova e maschera il {} per alcune shell - quale? , sfuggire al {}segno di spunta singolo ( ') non sembra più necessario con le conchiglie moderne come Bash.


1

Il modo semplice per eliminare ricorsivamente tutti i file normali nella directory corrente e nelle sottodirectory:

zsh -c 'rm **/*(.)'

Solo zsh ha qualificazioni globbing per abbinare i file per tipo. Tuttavia, il rmcomando non funziona su directory, quindi in bash puoi usare

shopt -s globstar
rm **/*

Questo non funziona per comandi diversi da quelli rmperò. In generale, puoi usare find:

find . -type f -delete

o se il tuo findnon supporta -delete:

find . -type f -exec rm {} +

-2

Avevo un requisito simile per eliminare i file da un percorso e dalle sue sottodirectory (filtrando per tempo) senza eliminare la struttura delle directory.

E ho usato il formato seguente che ha funzionato per me.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Sintassi: find (percorso del file) -mtime (maggiore o minore di giorni) -type f -exec rm {} \;

-type: menziona il tipo di file "f" per la directory "d" -exec: esegui il comando rm: remove {}: output del comando find

Nota: testarlo prima di usarlo. Sentiti libero di correggere o aggiornare se ho perso qualcosa.


1
poiché questo è un requisito aggiuntivo che non è stato menzionato dal PO e poiché la find ... rmstruttura di base è già stata coperta, non sono sicuro che si tratti di un prezioso contributo come nuova risposta a questa domanda.
Jeff Schaller
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.