Come rimuovo ricorsivamente sottodirectory e file, ma non la prima directory principale?


13

Sono in grado di utilizzare quanto segue per rimuovere la directory di destinazione e ricorsivamente tutte le sue sottodirectory e contenuti.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

Tuttavia, non desidero rimuovere la directory di destinazione. Come posso rimuovere solo i file nella destinazione, le sottodirectory e il loro contenuto?

Risposte:


11

La risposta precedente è quasi corretta. Tuttavia, non dovresti citare i personaggi di shell glob se vuoi che funzionino. Quindi, questo è il comando che stai cercando:

rm -rf "/target/directory with spaces/"*

Nota che * è al di fuori delle doppie virgolette. Questo modulo funzionerebbe anche:

rm -rf /target/directory\ with\ spaces/*

Se hai le *virgolette come mostrato sopra, tenterà solo di rimuovere il singolo file chiamato letteralmente *all'interno della directory di destinazione.


1
Questo non funziona con file e cartelle nascosti. Ho dovuto farlo ancora una volta con un
The Unfun Cat,

8

Altre tre opzioni.

  1. Utilizzare findcon -mindepth 1e -delete:

    -Mindepth livelli
    Non applicare alcun test o azione a livelli inferiori ai livelli (un numero intero non negativo).
    -Mindepth 1 significa elaborare tutti i file tranne gli argomenti della riga di comando.

    -elimina
    Elimina file; vero se la rimozione è riuscita. Se la rimozione non è riuscita, viene emesso un messaggio di errore. Se -delete fallisce, lo stato di uscita di find sarà diverso da zero (quando alla fine esce). L'uso di -delete attiva automaticamente l'opzione -depth.
    Testare attentamente con l'opzione -depth prima di utilizzare questa opzione.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. Utilizzare find, ma con i file, non le directory. Questo evita la necessità di rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. Procedi e rimuovi la directory principale, ma ricreala. È possibile creare una funzione bash per farlo con un solo comando; ecco un semplice one-liner:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

Che ne dite di

rm -rf /target/directory\ path/*

Se ci possono essere file che iniziano con. nella directory di destinazione.

rm -rf "/target/directory path/*" "/target/directory path/.??*"

Questo secondo corrisponderà a tutto ciò che inizia con un., Tranne. e .. Fallirà su nomi come .a, ma non è molto comune. Potrebbe essere modificato, se necessario, per coprire tutti i casi.


Ho provato entrambi e non funzionano per me. Forse è perché il mio percorso della directory di destinazione contiene spazi? rm -rf '/ target / directory path / *' Non dà alcun errore, ma rimangono le sottodirectory.
Michael Prescott,

È necessario sfuggire agli spazi, con una barra rovesciata (\) prima dello spazio o racchiudendo l'intero nome della directory tra virgolette ("). Ho modificato gli esempi per mostrarlo.
KeithB

Grazie, l'ho provato come mostrato nel mio commento precedente e ancora non ci riesco. (Sto usando OS X, importa?)
Michael Prescott,

OS X dovrebbe funzionare bene, questo è quello che sto usando. Assicurati di non usare sia la barra rovesciata che le virgolette. Solo l'uno o l'altro.
KeithB,

Sì, usando solo le virgolette. Se rimuovo * e quindi sto usando solo rm -rf "/ target / directory path /", la directory "percorso directory" verrà rimossa insieme alle sottodirectory "percorso directory". Se uso rm -rf "/ target / directory path / *", non succede nulla.
Michael Prescott,

2
find /target/directory/ -xdev -depth -mindepth 1 -exec 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.