많은 수의 XML 파일 포맷


11

중첩 된 디렉토리 구조에 흩어져있는 많은 XML 파일을 조작하고 있습니다.

나는 다음을 시도했다.

$ find . -name "*.xml" -type f | xargs -- xmllint --format

문제는 화면에 형식화 된 XML 출력을 생성하지만 파일을 변경하지 않는다는 것입니다.

실제 파일 내용이 변경되도록이 명령을 어떻게 변경합니까?

답변:


23

다음을 find사용하여 직접 수행 할 수 있습니다 -exec.

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

전달 된 -exec것은 템플릿 매개 변수 {}가 현재 파일 이름으로 대체 된 것을 발견 한 파일 당 한 번 호출됩니다 . \;find 명령의 끝에 그냥, 행을 종료합니다.

입력과 출력 파일 이름이 모두 같은 호출 내에서 지정되어야하므로 파일 당 한 번만 xargs호출해야하기 때문에이 경우에는 실제로 사용할 필요가 없습니다 xmllint.

xargsfind에서 파이프되는 명령이 한 번에 여러 파일에서 작동하고 해당 목록이 긴 경우에 필요합니다. 이 경우 단일 파일 이름을 --output옵션에 전달해야하므로이 작업을 수행 할 수 없습니다 xmllint. 없이 xargs당신이 "너무 오래 인수 목록의"로 끝날 수있는 오류는 많은 파일을 처리하는 경우. 옵션으로 xargs파일 바꾸기 문자열을 지원합니다 -I.

find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'

find -exec위 의 명령 과 동일하게 수행하십시오 . 같은 공간에 이상한 문자가있는 폴더가 있으면 및 -0옵션 을 사용해야합니다 . 그러나 사용 과 함께하는 옵션 의미 당신은뿐만 아니라 직접 사용할 수 있도록 수단은 어쨌든 한 번에 한 파일을 처리 와 함께 .findxargsxargs-I-L 1find-exec


@manatwork 편집에 감사드립니다-끈적 끈적한 손가락; o)
didster

방금 이것을 실행했으며 치료를하는 것으로 보입니다! 신속하고 간결한 답변에 감사드립니다!
Harry

2
"파일 목록이 너무 크면 실패합니다": 아니요, 실패하지 않습니다 (한 번에 하나의 파일을 처리하고 있음). 실제로 find … -exec가장 직접적인 방법입니다.
Gilles 'SO- 악마 그만

@ 길 좋은 지적! 이에 따라 답변을 업데이트했습니다.
didster

1
이것은 xmllint먼저 전체 XML 문서를 메모리에로드 한 다음 구문 분석 / 쓰기 만하기 때문에 작동 합니다. 이를 통해 문서 내 처리가 가능합니다.
gavenkoa

6

나는 일반적으로 간접 계층으로 이러한 문제를 공격합니다. 원하는 것을 수행하는 쉘 스크립트를 작성하고 호출하십시오. 나는 시작으로 제안 할 것이다

#! /bin/sh
for file
do
   xmllint --format $file > $file.tmp && mv $file.tmp $file
done

파일을 손으로 한 두 번 사용 해보고 xargs에서 바꿀 수 있습니다.

find . -name "*.xml" -type f | xargs -- xmltidy.sh

앞으로 좀 더 복잡한 조작을해야한다면 이것은 좋은 접근법처럼 보입니다. 답변 주셔서 감사합니다.
Harry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.