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.
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:
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 -r
per 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.
-print0
dice find
di stampare \0
caratteri invece di newline; e -0
dice xargs
di trattare solo \0
come separatore di argomenti.
Questo è chiamare rm
con molte directory contemporaneamente, evitando il sovraccarico di chiamare rm
separatamente 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à rm
con più directory contemporaneamente :
find . -name test -type d -exec rm -r {} +
(Nota +
alla fine; questo è equivalente alla xargs
soluzione.)
xargs
comando ha funzionato bene.
find /path/to/dir -name "test" -type d -delete
-name: cerca il nome passato. È possibile utilizzare -regex
per fornire nomi basati su espressioni regolari
-type: cerca i tipi di file. d
cerca 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.
+
invece di \;
passare più di una directory alla volta.
ancora un altro modo per farlo è
find . -name test -exec rm -R "{}" \;
Un link utile per trovare: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
Come sottolinea un'altra risposta, puoi tentare di trovare tutte le directory con il nome test
ed 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
In entrambi i casi, tuttavia, se una delle directory denominate test
contiene dei file, find
si lamenterà del fatto che Directory is not empty
e non riuscirà a rimuovere la directory.
Se intendevi eliminare tutti i file inclusa la test
directory, allora possiamo usare lo stesso trucco per eliminare tutti i file all'interno delle directory nominate per test
prime.
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
+
trovare. Non ne avevo idea, sicuramente avrei voluto saperlo molto tempo fa.