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.