Trova ed elimina tutte le directory denominate "test" in Linux


35

Ho molte directory chiamate "test" e vorrei rimuoverle.

So come trovarli e stamparli usando:

find . -name test -print

Ora, come posso rimuovere le directory?


Nota che ho anche dei file nella directory e devono essere rimossi.

Risposte:


70

xargs fa tutta la magia:

find . -name test -type d -print0|xargs -0 rm -r --

xargs esegue il comando passato come parametri, con gli argomenti passati a stdin.

Questo sta usando rm -rper cancellare la directory e tutti i suoi figli.

Il --indica la fine dei parametri, per evitare un percorso che iniziano -da essere trattato come un argomento.

-print0dice finddi stampare \0caratteri invece di newline; e -0dice xargsdi trattare solo \0come separatore di argomenti.

Questo è chiamare rmcon molte directory contemporaneamente, evitando il sovraccarico di chiamare rmseparatamente per ogni directory.


In alternativa, findè anche possibile eseguire un comando per ciascun file selezionato :

find . -name test -type d -exec rm -r {} \;

E questo, con prestazioni migliori, dal momento che chiamerà rmcon più directory contemporaneamente :

find . -name test -type d -exec rm -r {} +

(Nota +alla fine; questo è equivalente alla xargssoluzione.)


1
Ottima risposta, in particolare il +trovare. Non ne avevo idea, sicuramente avrei voluto saperlo molto tempo fa.
Scott,

fai attenzione all'ultimo comando, in qualche modo ha eliminato alcuni file. il xargscomando ha funzionato bene.
Henrique de Sousa,

23
find /path/to/dir -name "test" -type d -delete
  • -name: cerca il nome passato. È possibile utilizzare -regexper fornire nomi basati su espressioni regolari

  • -type: cerca i tipi di file. dcerca solo directory

  • -delete: azione che elimina l'elenco trovato.

In alternativa:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Come ha affermato JF Sebastian nei commenti:

È possibile utilizzare +invece di \;passare più di una directory alla volta.


1
Siamo spiacenti, ho dimenticato di dire che queste directory potrebbero contenere file. Non sono stato in grado di eliminarne alcuni a causa dell'errore "trova: impossibile eliminare` ./start ': directory non vuota "
Garbage Collection

@garbagecollection Ho aggiunto un aggiornamento.
jaypal singh

3
è possibile utilizzare +invece di \;passare più di una directory alla volta.
jfs

Grazie @JFSebastian Ottimo punto. Lo aggiungerò alla risposta.
jaypal singh


5

Puoi anche usare l'opzione -exec

find . -name test -exec rm {} \;

3

Supponendo bash 4+

shopt -s globstar
rm -r ./**/test/

La barra finale indica che corrisponderà solo alle directory. Il test è anticipato con:

printf '%s\n' ./**/test/

2

Supponiamo che tu stia usando gnu find , puoi usare l'opzione -delete:

find . -name test -delete

che è più facile da ricordare.


2

Come sottolinea un'altra risposta, puoi tentare di trovare tutte le directory con il nome tested eliminarle

find -name "test" -type d -delete

Ho riscontrato alcuni problemi con la compatibilità incrociata su Mac, quindi ho usato questo comando equivalente:

find -path "*/test" -type d -delete
  • -path : cerca uno schema nel nome file completo.

In entrambi i casi, tuttavia, se una delle directory denominate testcontiene dei file, findsi lamenterà del fatto che Directory is not emptye non riuscirà a rimuovere la directory.

Se intendevi eliminare tutti i file inclusa la testdirectory, allora possiamo usare lo stesso trucco per eliminare tutti i file all'interno delle directory nominate per testprime.

find -path "*/test/*" -delete

Il modello "*/test/*":, assicurerà che eliminiamo solo i file all'interno di una directory denominata /test/. Una volta che le directory sono vuote, possiamo andare avanti ed eliminare le directory usando il primo comando:

find -path "*/test" -type d -delete

Esempio:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
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.