2009-10-19 17 views
11

Próbuję napisać polecenie bash, które usunie wszystkie pliki pasujące do określonego wzorca - w tym przypadku wszystkie stare pliki dziennika vmware zostały skompilowane.Skrypty powłoki: Używanie basha z xargs

Próbowałem tego polecenia:

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

Jednak kiedy uruchomić polecenie, że dławi się na wszystkie foldery, które mają spacje w ich nazwach. Czy istnieje sposób na sformatowanie ścieżki pliku, aby xargs przekazał ją do cytowania lub poprawnego ucieczki?

+0

Krzyża pisał: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

Odpowiedz

24

Spróbuj użyć:

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

Powoduje znaleźć na wyjście znak null po każdej nazwy pliku i mówi xargs zerwać nazwy w oparciu o zerowych znaków zamiast spacji lub innych tokenów.

5

Sprawdź flagę -0 dla xargs; w połączeniu z find 's -print0 powinieneś być ustawiony.

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

Nie używaj xargs. Znaleźć można to zrobić bez pomocy:

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

+3

To zawsze dobry aby uniknąć rozpoczynania dodatkowego procesu, zwłaszcza czegoś podobnego, w sytuacji, w której mógłbyś zapewnić coś zbyt długiego xargsowi. Zauważ, że 'find' ma nawet operację' delete', którą możesz użyć zamiast '-exec ...' - ale łatwiej jest ją dostosować w ten sposób. Nie musisz też cytować nawiasów klamrowych, chyba że używasz starej powłoki, takiej jak tcsh. – Cascabel

+3

Ale to spowoduje uruchomienie procesu 'rm' dla każdego pliku z osobna, zamiast przekazywania kilku nazw plików do' rm', jak robi to 'xargs', więc będzie wolniej. – JaakkoK

+5

@jk: Dlatego nowsze implementacje 'find' mają' find -exec rm '{}' + ', które będą grupować argumenty tak jak' xargs'. – ephemient

1

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

korzystanie -iname dla wyszukiwania wzorca

0

Aby uniknąć kosmiczny problem w xargs I użyje znaku nowej linii jako sep Arator z opcją -d:

find . -name vmware-*.log | xargs -d '\n' rm 
Powiązane problemy