bash를 사용하여 폴더의 모든 파일을 반복합니다.

bash를 사용하여 폴더의 모든 파일을 반복합니다.

내 폴더에 pandoc을 사용하여 html로 변환하고 싶은 마크다운 파일이 많이 있습니다.

내가 일반적으로 사용하는 명령은

pandoc Atten.md -f markdown -t html --css pandoc.css -o Atten.html

Atten.md일반적인 마크다운 파일의 이름은 어디에 있습니까? 그러나 위에서 수행한 대로 모든 파일을 반복하고 .md를 .html로 변환하고 싶습니다. Bash나 zsh에서는 어떻게 하나요?

답변1

와 함께 find:

find path/to/dir -name "*.md" -type f -exec sh -c '
      pandoc -f markdown -t html --css pandoc.css -o "${1%.*}.html" "$1"
   ' find-sh {} \;

Bash, Zsh 및 기타 여러 쉘에서 작동합니다. 외부 쉘의 유일한 작업은 find적절한 인수를 사용하여 실행하는 것입니다.

이 버전은 sh가능한 한 많은 파일을 처리하기 위해 단일 파일을 생성합니다( sh필요한 경우 더 많은 프로세스가 생성됩니다).

find path/to/dir -name "*.md" -type f -exec sh -c '
      for f; do
         pandoc -f markdown -t html --css pandoc.css -o "${f%.*}.html" "$f"
      done
   ' find-sh {} +

노트:

  • 내부 셸은 이전 확장을 제거해야 하기 때문에 호출됩니다. 요구 사항이 아닌 경우 솔루션이 … -exec pandoc … -o {}.html {} \;작동할 것입니다. POSIX는 find밑창 하나를 교체 해야 하기 때문에 "아마도"입니다 {}. find더 많은 것이 대체되는 경우(예: {}.html또는 의 두 번째 모양 ) 사용하는 구현 의 "의례"입니다 {}.
  • -execdir대신 -exec더 좋을 것이지만 POSIX는 아닙니다.
  • -execdir옵션으로 해석되는 것을 방지하기 위해 ./"$1"대신 "$1"(각각: ./"$f"대신 ) 을 사용할 수 있습니다 . 또 다른 접근법은"$f"pandoc--하지만 지원하는지는 모르겠습니다 pandoc. 귀하의 경우에는 로 시작해야 하기 때문에 로 "$1"시작하는 것으로 확장할 수 없다고 생각합니다 . 로 시작 하면 애초에 로 잘못 해석될 것입니다 . 일반적으로 이러한 우려는 타당합니다.-path/to/dirpath/to/dir-find
  • 호출 에서 pandoc나는 가장 일반적인 순서를 선호하기 때문에 피연산자를 끝으로 옮겼습니다 command -options operands.

  • 해결책은 재귀적입니다. 비재귀적으로 만들려면 -maxdepth 1. 지원 find하지 않으면 -maxdepth공부하십시오이것또는 삭제 find하고 외부 셸이 파일을 반복하도록 합니다.

    # written for Bash
    ( cd path/to/dir || exit 125
    for f in ./*.md ./.*.md; do
        [ -f "$f" ] &&
        pandoc -f markdown -t html --css pandoc.css -o "${f%.*}.html" "$f"
    done )
    

    위 코드와 관련된 참고사항:

    • 서브쉘은 cd현재 쉘에 영향을 주지 않고 작동하기 위한 것입니다.
    • cd어떤 이유로든 실패 하면 나머지는 실행되지 않습니다. 이는 좋은 습관입니다.
    • ./*.md대신 일반은 나중에 옵션으로 해석되는 것을 *.md방지합니다 ."$f"
    • ./.*.md./*.md도트 파일과 일치하지 않기 때문에 추가되었습니다 .
    • [ -f "$f" ]예방하는 것입니다
      • pandoc디렉토리, 특수 파일 등을 호출합니다 .
      • 패턴과 일치하는 것이 없을 때 pandoc존재하지 않는 ./*.md(또는 )을 호출합니다 ../.*.md
    • Zsh는 다소 다릅니다. 그래도 코드는 작동해야 하며 어쨌든 서브쉘이 유용하기 때문에 정상적인 쉘에서 명시적으로 sh호출해도 큰 차이는 없습니다 .sh

      sh -c 'cd path/to/dir || exit 125
             for …
             done '
      

답변2

find당신은 다음을 사용해야합니다 -exec(참조남자 찾기):

find YourDirectory -name \*.md | \
  while IFS= read fn; do \
  pandoc ${fn} -f markdown -t html --css pandoc.css -o ${fn%.md}.html ; done

아니면 -execdir

답변3

다음을 사용하여 파일을 반복할 수 있습니다.

for item in *.md; do CONVERT_FILE_COMMAND $item "$(basename '$item' .md).html; done

관련 정보