Można to zrobić find
bezpośrednio, używając -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
To, co -exec
zostanie 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 xargs
tym przypadku użycie naprawdę nie jest konieczne, ponieważ musimy wywoływać xmllint
jeden plik, ponieważ nazwy plików wejściowych i wyjściowych muszą być określone w ramach tego samego wywołania.
xargs
był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 --output
opcji xmllint
. Bez tego xargs
może wystąpić błąd „Zbyt długa lista argumentów”, jeśli przetwarzasz wiele plików. xargs
obsługuje również ciągi zamiany plików z -I
opcją:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Zrobi to samo co find -exec
powyższe polecenie. Jeśli któryś z folderów ma nieparzyste znaki w podobnych przestrzeniach, musisz użyć -0
opcji find
i xargs
. Ale używanie xargs
z -I
implikuje opcję, -L 1
która oznacza, że i tak przetwarzasz tylko 1 plik na raz, więc równie dobrze możesz użyć bezpośrednio find
z -exec
.