명령(ls)의 출력을 가져와 다른 명령에 사용하는 스크립트

명령(ls)의 출력을 가져와 다른 명령에 사용하는 스크립트

epub으로 변환하고 싶은 PDF 파일 세트가 있습니다. 나는 Calibre의 명령이 ebook-convert트릭을 수행한다는 것을 알고 있습니다(추가할 수도 있음). 하지만 파일이 두 개 이상 있습니다.

ls > file특정 파일을 실행하고 각 항목이 변수가 되도록 구문 분석하는 스크립트를 실행할 수 있기를 원합니다 . 그런 다음 변수를 ebook-convert입력 파일로 사용하고 어떻게든 변수를 출력 파일로 사용하되 .epub파일 이름 끝에 a를 추가하시겠습니까?

답변1

확장하겠습니다제이슨 라이언무엇을 설명하는 답변이지만 방법이나 이유는 설명하지 않습니다.

한 명령의 출력을 다른 명령의 인수로 사용할 수 있습니다. 이것은 ... 불리운다명령 대체.

some_text='Hello, world'
uppercased="$(echo "$some_text" | tr a-z A-Z)"
echo "Now, it's $uppercased"

그러나 $(ls …)이는 다음 두 가지 이유로 무섭습니다.

  • ls의 출력을 구문 분석하지 마십시오.. 구문 분석이 가능하도록 설계되지 않았습니다.
  • "$(some-command)"이 명령의 출력인 문자열을 제공합니다. 요소 목록을 반환하는 명령이 있는 경우 문자열을 개별 요소로 구문 분석해야 합니다. 간단한 구분 기호를 찾을 수 없으면 이는 지루하고 신뢰할 수 없습니다. 파일 이름의 경우 대부분의 unice의 파일 이름에는 모든 문자 ⁰이 포함될 수 있으므로 구분 기호를 쉽게 찾을 수 없습니다.

$(some-command)대신 쓰면 "$(some-command)"명령의 출력이 단어로 분할되어 와일드카드로 표시됩니다. 이전 문장을 이해하기 전에 항상 명령 대체 주위에 큰따옴표를 넣으십시오. 이해했다면, 이해할 수 없는 이유를 알지 않는 한 항상 큰따옴표를 추가하십시오.

다행히 특정 패턴과 일치하는 파일 목록을 생성하는 기능은 셸에 내장된 기능입니다. 그것은 알려져있다와일드카드.

echo *.pdf

여러 파일에 대한 작업을 수행하려면 루프를 사용할 수 있습니다.

for x in *.pdf; do …; done

나머지 장애물은 개체 파일의 이름을 생성하는 것입니다. 쉘에는 ${foo%SUFFIX}접미사가 제거된 변수 값을 가져오는 것을 포함하여 몇 가지 간단한 텍스트 조작 명령이 있습니다. (게다가 ${foo#PREFIX}.)

for x in *.pdf; do
  ebook-convert "$x" "${x%.pdf}.epub"
done

변수 대체 주위에 큰따옴표가 있습니다. 이유는 명령 대체와 동일합니다.

⁰널 문자를 제외 하고 대부분의 쉘은 이를 처리할 수 없습니다.

답변2

이는 더 간단한 접근 방식일 수 있습니다.

for file in *.pdf; do
    ebook-convert "$file" "${file%.pdf}.epub"
done
exit 0

답변3

변환 실행에 약간의 이점이 있는 한 문장 답변평행선:

parallel ebook-convert {} {.}.epub ::: *.pdf

안쓰는게 익숙해for 루프더 이상 껍질에 있지 않습니다. 모두 깔끔하게 교체 가능합니다GNU 병렬.

관련 정보