Jak użyć polecenia find do usunięcia plików pasujących do wzorca?

17

Próbuję napisać polecenie bash, które usunie wszystkie pliki pasujące do określonego wzorca - w tym przypadku są to wszystkie stare pliki dziennika vmware, które się utworzyły.

Próbowałem tego polecenia:

find . -name vmware-*.log | xargs rm

Jednak po uruchomieniu polecenia dusi wszystkie foldery, które mają spacje w nazwach. Czy istnieje sposób na sformatowanie ścieżki do pliku, aby xargs przekazał ją do cytowanego pliku rm lub poprawnie uciekł?

Dan Monego
źródło
Przeniesiony: stackoverflow.com/questions/1590297/...
Wstrzymany do odwołania.

Odpowiedzi:

20

Ogólnie uważam, że korzystanie z -execopcji findjest łatwiejsze i mniej mylące. Spróbuj tego:

find . -name vmware-*.log -exec rm -i {} \;

Wszystko po -execjest traktowane jako polecenie do uruchomienia dla każdego wyniku, aż do znaku ;, który jest tutaj uciekany, aby został przekazany find. {}Otrzymuje z nazwy pliku, który findnormalnie drukować.

Po zweryfikowaniu, że robi to, co chcesz, możesz usunąć -i.

Jeff Snider
źródło
1
Ponadto, jeśli są to tylko pliki, które chcesz usunąć, a nie katalogi, możesz dodać „typ f” do polecenia find.
JamesHannah,
18

Jeśli masz GNU find, możesz użyć -deleteopcji:

find . -name "vmware-*.log" -delete

Aby użyć xargsi uniknąć problemu ze spacjami w nazwach plików:

find . -name vmware-*.log -print0 | xargs -0 rm

Pliki dziennika nie powinny jednak zawierać spacji w nazwach. Dokumenty do edycji tekstu i pliki MP3 prawdopodobnie je mają, ale powinieneś mieć możliwość kontrolowania nazw plików dziennika.

Wstrzymano do odwołania.
źródło
To miłe. Nie wiedziałem o tym.
Jeff Snider,
8

Możesz powiedzieć, findaby oddzielić listę wyników NULL i xargsotrzymać tę samą listę danych wejściowych:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Upewnij się także, że uciekasz *, albo odwrotnym ukośnikiem, albo zawierając vmware-*.logcudzysłowy, w przeciwnym razie twoja powłoka może próbować ją rozwinąć przed przekazaniem find.

James Sneeringer
źródło
6

Nie zapomnij o -deleteopcji znalezienia . Usuwa plik bez błędów ze znakami specjalnymi ...

Dom
źródło