Jakie jest użycie -exec xargs i -print0?

20

Myślę, że są to typowe sposoby przekazywania wyniku jednego polecenia do następnego, jako danych wejściowych.

Jak działają te trzy? Lub jakie są niektóre strony / adresy URL?

James Bond
źródło

Odpowiedzi:

25

Pierwsze rzeczy do wpisania:

man find

man xargs

W findkomenda wyniki na standardowe wyjście domyślnie, więc -printopcja jest zazwyczaj nie są potrzebne, ale -print0rozdziela nazwy plików z (null) bajt 0 tak, że nazwy zawierające spacje lub znaki nowej linii mogą być interpretowane poprawnie.

-execOpcja jest coś, co można używać zamiast xargs - polecenie find wykonuje polecenia dla każdej pozycji znajdzie.

xargsKomenda czyta czasoprzestrzeni lub nowej linii oddzielone sznurki (zwykle od znajdowania polecenia, ale mogą pochodzić z dowolnego miejsca) i wykonuje jakąś komendę dla każdej struny.
Jeśli xargs jest uruchamiany z opcją -0 , będzie oczekiwać łańcuchów rozdzielonych przez NULL jako danych wyjściowych przezfind ... -print0

Zaletą xargs jest to, że może grupować ciągi razem, dzięki czemu wykonuje polecenie tylko raz lub dwa razy zamiast n razy.

W normalnym użyciu:

find start_directory -name '*.txt' | xargs ls -l 

find wyświetli listę nazw plików, a xargs wyda polecenia takie jak:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

co jest szybsze niż wydawanie komendy find:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
njd
źródło
7

Zauważ, że xargs nie jest już potrzebny w obecnych implementacjach find, które prawdopodobnie wszystkie obsługują tę składnię POSIX:

find directory -name '*.txt' -exec ls -l {} + 

co jest prostsze i nieco szybsze niż wariant xargs.

find directory -name '*.txt' | xargs ls -l 
jlliagre
źródło
xargs zużywa znacznie mniej zasobów niż „find -exec”
Felipe Alvarez
7
To jest na odwrót. Przesyłanie potokowe do xargs zużyje nieco więcej zasobów niż -exec. Prawdopodobnie przeoczysz terminator „+”.
jlliagre