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 dkatalogów ...
find ... | xargs ...idiomu, przetwarza pliki w partiach, a zwykle będzie to szybsze (mniej uruchomionych procesów).
Użyj -print0opcji znajdowania i -0opcji, xargsjeśli masz nazwy plików lub katalogów ze spacjami:
find {dir} -print0 | xargs -0r {command}
-print0Opcja znaleźć wypisuje nazw jako NUL-separated zamiast spacji listy rozdzielone, natomiast -0opcja xargsnakazuje mu złamać swoje wejście na NULzamiast spacji. Ponieważ NULjest 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 -rjest opcja, xargsktó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. :)