コマンド(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 …)これは次の2つの理由で恐ろしいです。

  • 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

変数置換の周りに二重引用符があります。理由はコマンド置換と同じです。

⁰ヌル文字を除いて、ほとんどのシェルはこれを処理できません。

おすすめ記事