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:
Ogólnie uważam, że korzystanie z
-exec
opcjifind
jest łatwiejsze i mniej mylące. Spróbuj tego:Wszystko po
-exec
jest traktowane jako polecenie do uruchomienia dla każdego wyniku, aż do znaku;
, który jest tutaj uciekany, aby został przekazanyfind
.{}
Otrzymuje z nazwy pliku, któryfind
normalnie drukować.Po zweryfikowaniu, że robi to, co chcesz, możesz usunąć
-i
.źródło
Jeśli masz GNU
find
, możesz użyć-delete
opcji:Aby użyć
xargs
i uniknąć problemu ze spacjami w nazwach plików: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.
źródło
Możesz powiedzieć,
find
aby oddzielić listę wyników NULL ixargs
otrzymać tę samą listę danych wejściowych:Upewnij się także, że uciekasz
*
, albo odwrotnym ukośnikiem, albo zawierającvmware-*.log
cudzysłowy, w przeciwnym razie twoja powłoka może próbować ją rozwinąć przed przekazaniemfind
.źródło
Nie zapomnij o
-delete
opcji znalezienia . Usuwa plik bez błędów ze znakami specjalnymi ...źródło