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?
command-line
scripting
directory
find
Brian Lyttle
źródło
źródło
-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:-print0
Opcja znaleźć wypisuje nazw jakoNUL
-separated zamiast spacji listy rozdzielone, natomiast-0
opcjaxargs
nakazuje mu złamać swoje wejście naNUL
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.źródło
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.
źródło
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.
źródło
Upewnij się, że wersja polecenia, którego używasz, nie ma jeszcze flagi operacji rekurencyjnej. :)
źródło
Działa najlepiej dla mnie.
źródło