
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
에도 계속 사용할 수 있지만 별도의 파일을 만들 필요는 없습니다.-print0
xargs -0
답변3
{}
pandoc 명령에 a가 누락된 것 같습니다.
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
그러나 그러면 이름이 지정된 파일이 있게 됩니다 001.htm.md
. 이것이 문제인지 결정해야 합니다.