2013-12-13 3 views
2

디렉토리를 살펴보고 모든 XML 파일을 찾아 xmllint을 실행하고 서식이 지정된 결과를 파일에 저장하려고하는 스크립트를 작성하려고합니다. formatted이라는 하위 디렉토리에 같은 이름의 지금까지 가지고있는 스크립트는 다음과 같습니다.디렉토리의 모든 XML 파일을 형식화하여 하위 디렉토리에 저장

find . -maxdepth 1 -type f -iname "*.xml" | xargs -I '{}' xmllint --format '{}' > formatted/'{}' 

이것은 어느 정도까지 작동합니다. 하위 디렉토리는 "{}"이라는 하나의 파일로 끝납니다.이 파일은 xmllint을 통해 처리 된 최종 파일의 결과입니다. 파일을 서브 디렉토리에 올바르게 기록하려면 어떻게해야합니까?

답변

5

표시되는 {} 파일의 파일 형식은 모두 입니다. 그 이유는 사용중인 리디렉션이 실제로 xargs이 보는 명령의 일부가 아니기 때문입니다. 리디렉션 쉘에 의해 해석되고, 그래서 그것이 무엇을

find . -maxdepth 1 -type f -iname "*.xml" | xargs -I '{}' xmllint --format '{}' 

을 실행하고 formatted/{}라는 이름의 파일에 출력을 저장합니다.

대신 리디렉션의 xmllint--output 옵션을 사용해보십시오 :

... | xargs -I '{}' xmllint --format '{}' --output formatted/'{}' 

또한 find-exec 옵션을 사용하여 xargs를 호출 방지 할 수 있습니다

find . -maxdepth 1 -type f -iname "*.xml" -exec xmllint --format '{}' --output formatted/'{}' \; 
+0

감사에 대해 알지 못했다 xmllint를위한'--output' 옵션. 나는 두 솔루션을 ('xargs'와'-exec'로) 테스트했고, 둘 다 완벽하게 작동합니다. 흥미롭게도,'find' man page는''{{} '의 인스턴스가'-exec'을 사용할 때 명령 내에서 허용된다는 것을 언급합니다. 그래서''xargs' '를 원래 선택 했었습니다. 잘 됐네. – Ben

+0

@Ben 맨 페이지의 나의 버전에서 문구는'-exec command {} +'문법을 위해 존재하지만, 여기서'-exec command;'문법이 사용됩니다. 이것은 맨 페이지의 몇 줄 위에 설명되어 있습니다 . –