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"
しかし、これは次の2つの理由で恐ろしいです。$(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パラレル。