Istnieje wiele sposobów, aby to zrobić, w tym pętle w skrypcie powłoki, find i xargs. Który z nich jest najlepszy, a który najbardziej przenośny?
Istnieje wiele sposobów, aby to zrobić, w tym pętle w skrypcie powłoki, find i xargs. Który z nich jest najlepszy, a który najbardziej przenośny?
Odpowiedzi:
find . -exec <command> {} \;
dla bieżącego katalogu jako katalogu głównego drzewa lub ogólnie:
find <directory> -exec <command> {} \;
-name "*.c"
lub na przykład -type d
katalogów ...
find ... | xargs ...
idiomu, przetwarza pliki w partiach, a zwykle będzie to szybsze (mniej uruchomionych procesów).
Użyj -print0
opcji znajdowania i -0
opcji, xargs
jeśli masz nazwy plików lub katalogów ze spacjami:
find {dir} -print0 | xargs -0r {command}
-print0
Opcja znaleźć wypisuje nazw jako NUL
-separated zamiast spacji listy rozdzielone, natomiast -0
opcja xargs
nakazuje mu złamać swoje wejście na NUL
zamiast spacji. Ponieważ NUL
jest to jeden z znaków, który jest niedozwolony w nazwach plików w systemie Unix, nie można go pomylić z częścią nazwy pliku.
Dostępna -r
jest opcja, xargs
która nie spowoduje błędu, jeśli nie zostanie wprowadzona.
Jeśli przenośność jest problemem, trzymałbym się z dala od specyficznych dla powłoki sposobów robienia tego (wiele osób używa wielu różnych powłok, ale ogólnie find i xargs to naprawdę podstawowe narzędzia, których nikt nie odważyłby się zmienić w radykalny sposób) .
Użycie podstawowych argumentów find i xargs powinno dać bardziej przenośne rozwiązanie.
Jeśli grupowanie argumentów razem jest dopuszczalne, znajdź | xargs prawdopodobnie zapewni lepszą wydajność, ponieważ wykona polecenie znacznie mniej razy niż find -exec. Jeśli chcesz wykonać polecenie za każdym razem dla każdego pliku lub wykonać w podkatalogu pliku, prawdopodobnie powinieneś użyć find -exec lub -execdir.
Z reguły lepiej unikać pętli specyficznych dla powłoki; find i xargs są wystarczające dla większości scenariuszy.
Upewnij się, że wersja polecenia, którego używasz, nie ma jeszcze flagi operacji rekurencyjnej. :)