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ł?


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.


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.


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.


6

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.