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 -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.)
xargscomando ha funzionato bene.
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.
+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 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
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
+trovare. Non ne avevo idea, sicuramente avrei voluto saperlo molto tempo fa.