Można to zrobić findbezpośrednio, używając -exec:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
To, co -execzostanie przekazane, zostanie wywołane raz na znaleziony plik, a parametry szablonu {}zostaną zastąpione bieżącą nazwą pliku. Na \;końcu polecenia find kończy linię.
W xargstym przypadku użycie naprawdę nie jest konieczne, ponieważ musimy wywoływać xmllintjeden plik, ponieważ nazwy plików wejściowych i wyjściowych muszą być określone w ramach tego samego wywołania.
xargsbyłoby potrzebne, gdyby polecenie, do którego przesyłane było polecenie find, działało na wielu plikach jednocześnie, a ta lista była długa. Nie możesz tego zrobić w tym przypadku, ponieważ musisz przekazać pojedynczą nazwę pliku do --outputopcji xmllint. Bez tego xargsmoże wystąpić błąd „Zbyt długa lista argumentów”, jeśli przetwarzasz wiele plików. xargsobsługuje również ciągi zamiany plików z -Iopcją:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Zrobi to samo co find -execpowyższe polecenie. Jeśli któryś z folderów ma nieparzyste znaki w podobnych przestrzeniach, musisz użyć -0opcji findi xargs. Ale używanie xargsz -Iimplikuje opcję, -L 1która oznacza, że i tak przetwarzasz tylko 1 plik na raz, więc równie dobrze możesz użyć bezpośrednio findz -exec.