Bashでは、中括弧拡張はワイルドカード結果を存在しないファイルにコピーしません。
たとえば、現在のディレクトリにという名前のファイルがあり、1.epub
拡張子を除いて同じファイル名を持つpdfファイルに変換したいと思います。 PDFファイルは1.pdf
まだ存在しません。
$ ebook-convert *.{epub,pdf}
結果ファイルは*.pdf
。
Bashでは、まずepubファイルのデフォルト名を変数として抽出し、その変数の値を使用してpdfファイルの名前を指定する必要がありますか?
Bashや他のシェルにはよりエレガントなソリューションがありますか?
ベストアンサー1
シェル技術はループを使用します。
shとbashやzshなどの他のshのようなシェルから:
for f in *.epub; do
ebook-convert -- "$f" "${f%.epub}.pdf"
done
zshでは、次のように短縮できます。
for f (*.epub(N)) ebook-convert -- $f $f:r.pdf
N
ullglob glob修飾子は、一致するファイルがない場合でもエラーを防ぎます。 bashには対応する機能はありませんが、nullglob
ksh93で事前にオプションを設定することもできます。for f in ~(N)*.epub; do...
rename
次のプログラムがインストールされている可能性があります。man 1 rename