이러한 명령을 하나로 결합하려면 어떻게 해야 합니까?

이러한 명령을 하나로 결합하려면 어떻게 해야 합니까?

이것이 내가 하고 싶은 일이다:

HTML 파일 폴더를 Markdown으로 변환하고 YAML로 변환하여 각 HTML 파일의 XML 메타데이터를 복사합니다.

조사한 결과 다음 명령을 찾았습니다.

  1. find . -name \*.md -type f -exec pandoc -o {}.txt {} \;

  2. find / -name "*.md" -type f -exec sh -c 'markdown "${0}" > "${0%.md}.html"' {} \;

  3. pandoc -f html -t markdown -s input.html -o output.md

    • 이것은 여기서 발견됩니다.다음은 분명히 메타데이터를 복사하여 YAML로 변환하는 pandoc 명령입니다. 그러나 파일 폴더에서는 열릴 때만 작동하지 않습니다.

나에게 필요한 것은 변환된 파일에 대해 ".md"를 제공하는 pandoc을 사용하는 명령입니다. .html.md 대신 확장자를 사용하고 XML 메타데이터를 YAML로 변환합니다. 이 모든 것은 이 세 가지 명령을 사용하여 수행할 수 있습니다. 이를 하나의 명령으로 결합하면 됩니다.

답변1

필요한 것은 xargs입니다. 나는 pandoc에 익숙하지 않지만 다음과 같이 작동해야 합니다.

$ find . -name \*.html -type f | sed 's/\.html$//' | xargs -I {} pandoc -f html -t markdown -s -o "{}.md" "{}.html"

그러면 찾기를 사용하여 선택한 디렉터리(및 모든 하위 디렉터리)에 있는 모든 .html 파일을 나열합니다. 이것들은 sed로 파이프되어 ".html" 확장자를 제거한 다음 xargs로 파이프되어 이를 pandoc에 하나씩 공급하고(구문을 올바르게 사용하는 경우) 각 이름을 가져옵니다({}로 대체됨). ), 각 html 파일을 소스로 사용하고 소스 파일과 동일한 디렉터리에 확장자가 md인 새 파일로 출력됩니다.

결국에는 원본 html 파일과 동일한 수의 일치하는 md 파일이 동일한 디렉터리에 있어야 합니다.

답변2

HTML 파일 폴더를 Markdown으로 변환하고 YAML로 변환하여 각 HTML 파일의 XML 메타데이터를 복사합니다.

이를 사용하여 find프로세스를 구동할 수 있습니다. 명령을 작성하는 방법은 다음과 같습니다.

  1. 그러면 쉘(glob) 패턴과 일치하는 파일 세트가 생성됩니다 *.html.

    find . -type f -name '*.html'
    
  2. 그러면 HTML 파일이 Markdown으로 변환됩니다.

    pandoc -f html -t markdown -s input.html -o output.md
    
  3. 일치하는 각 파일에 대해 및 를 pandoc교체하여 명령을 반복해야 합니다. 다음을 사용하여 파일 이름 대체를 처리 합니다 .input.htmloutput.mdsh

    find . -type f -name '*.html' -exec sh -c 'pandoc -f html -t markdown -s "$1" -o "${1%html}md"' _ {} \;
    
  4. 일치하는 파일의 각 인스턴스를 시작하는 것은 상대적으로 비용이 많이 들기 때문에 sh여러 파일을 동시에 처리하도록 하겠습니다.

    find . -type f -name '*.html' -exec sh -c 'for h in "$@"; do m="${h%html}md"; pandoc -f html -t markdown -s "$h" -o "$m"; done' _ {} +
    

YAML을 생성하는 명령을 제공하지 않은 것 같아서 솔루션에 포함하지 않았습니다. 그러나 생성된 Markdown과 함께 별도의 파일이라면 쉘 루프에 명령을 삽입하는 것이 매우 쉬울 것입니다.

답변3

많은 사람들에게 xargs이를 사용하여 find출력을 처리하는 것이 완전히 이해되지 않은 것처럼 보일 수 있습니다. while read모든 파일을 반복하려면 -loop를 사용하면 이해하기가 더 쉬울까요 ?

찾다. - 이름 "*.html" - 줄을 읽을 때 f |
    pandoc "${라인}"\
           -fhtml\
           -t 가격 인하 \
           -에스\
           -o "${line%%.html}.md"
    완벽한

만약을 대비해 공백이 포함된 파일을 가리는 데에도 따옴표가 사용됩니다. 이 구조 ${line%%.html}는 "Bashistic"이며 다른 쉘에서는 작동하지 않을 수 있습니다. 그것은 무엇이든 제거합니다.html- 파일 이름의 접미사입니다.

관련 정보