find, xargs 등을 사용하여 비슷한 이름의 파일 출력

find, xargs 등을 사용하여 비슷한 이름의 파일 출력

HTML 파일로 가득 찬 폴더가 있습니다.

001.htm
002.htm
003.htm

비슷한 이름의 Markdown 파일로 변환하기 위해 Pandoc을 실행하고 싶습니다.

001.md
002.md
003.md

이 명령은 다음 중 하나에서 작동합니다.

pandoc -f html -t markdown 001.htm -o 001.md

그리고 폴더의 모든 파일에 대해 유사한 명령을 사용 find하고 자동으로 실행하고 싶습니다 .xargs

나는 이것까지 얻었다 :

find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}

...디렉토리의 모든 파일이 잘리므로 이제 확인하기 전에 묻습니다.정말뭔가를 부수십시오.

위의 명령에 어떤 문제가 있습니까? 그리고/또는 이 작업을 수행하는 완전히 다른/더 효율적인 방법은 무엇입니까?

답변1

나는이 1 라이너로 그것을 할 수있었습니다. xargs및 부분 에 대해 융통성이 있다면 find.

for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done

재귀적으로 작업하려면(즉, .htm현재 디렉터리의 모든 파일과 모든 하위 디렉터리) (bash 4+라고 가정) globstar쉘 옵션을 사용할 수 있습니다.

shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done

답변2

일부 상황에서는 사용이 {}충분히 유연하지 않습니다. 이것도 그중 하나인 것 같습니다.

가능한 해결 방법은 다음과 같이 -exec의 스크립트를 사용하는 것입니다 find.

find . -name '*.htm' -exec ./convert-to-md.sh {} \;

스크립트 파일은 정확한 pandoc명령줄에 따라 다음과 유사해야 합니다.

#!/bin/bash
pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"

이를 위해 스크립트 파일을 생성하고 저장하지 않으려면 언제든지 bash스크립트 코드를 인라인할 수 있습니다.

find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"' -

-끝에 있는 추가는 $0일반적으로 쉘 스크립트의 이름, 에서 시작하는 위치 인수를 포함하는 bash를 채우는 역할을 합니다 $0.

이렇게 하면 이상한 파일 이름을 처리하는 경우 find에도 계속 사용할 수 있지만 별도의 파일을 만들 필요는 없습니다.-print0xargs -0

답변3

{}pandoc 명령에 a가 누락된 것 같습니다.

find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md

그러나 그러면 이름이 지정된 파일이 있게 됩니다 001.htm.md. 이것이 문제인지 결정해야 합니다.

관련 정보