답변:
다음을 find
사용하여 직접 수행 할 수 있습니다 -exec
.
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
전달 된 -exec
것은 템플릿 매개 변수 {}
가 현재 파일 이름으로 대체 된 것을 발견 한 파일 당 한 번 호출됩니다 . \;
find 명령의 끝에 그냥, 행을 종료합니다.
입력과 출력 파일 이름이 모두 같은 호출 내에서 지정되어야하므로 파일 당 한 번만 xargs
호출해야하기 때문에이 경우에는 실제로 사용할 필요가 없습니다 xmllint
.
xargs
find에서 파이프되는 명령이 한 번에 여러 파일에서 작동하고 해당 목록이 긴 경우에 필요합니다. 이 경우 단일 파일 이름을 --output
옵션에 전달해야하므로이 작업을 수행 할 수 없습니다 xmllint
. 없이 xargs
당신이 "너무 오래 인수 목록의"로 끝날 수있는 오류는 많은 파일을 처리하는 경우. 옵션으로 xargs
파일 바꾸기 문자열을 지원합니다 -I
.
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
find -exec
위 의 명령 과 동일하게 수행하십시오 . 같은 공간에 이상한 문자가있는 폴더가 있으면 및 -0
옵션 을 사용해야합니다 . 그러나 사용 과 함께하는 옵션 의미 당신은뿐만 아니라 직접 사용할 수 있도록 수단은 어쨌든 한 번에 한 파일을 처리 와 함께 .find
xargs
xargs
-I
-L 1
find
-exec
find … -exec
가장 직접적인 방법입니다.
xmllint
먼저 전체 XML 문서를 메모리에로드 한 다음 구문 분석 / 쓰기 만하기 때문에 작동 합니다. 이를 통해 문서 내 처리가 가능합니다.
나는 일반적으로 간접 계층으로 이러한 문제를 공격합니다. 원하는 것을 수행하는 쉘 스크립트를 작성하고 호출하십시오. 나는 시작으로 제안 할 것이다
#! /bin/sh
for file
do
xmllint --format $file > $file.tmp && mv $file.tmp $file
done
파일을 손으로 한 두 번 사용 해보고 xargs에서 바꿀 수 있습니다.
find . -name "*.xml" -type f | xargs -- xmltidy.sh