次の順序でさまざまな数の写真を生成するプログラムがあります。
1.jpg, 2.jpg [...] 10.jpg..etc
10が2、3などの前に処理されるため、これを入力として使用することはできません*.jpg
。だから、私は次を使用したいと思います。
convert page_{1..$N}.jpg out.pdf
しかし、うまくいきません。コマンドは何でなければなりませんか?
答え1
ファイル名を配列に保存し、次のように作成できますseq
。
pages=( $(printf 'page_%d.jpg\n' $(seq $N)) )
convert "${pages[@]}" out.pdf
答え2
支柱の拡張が行われるので今後変数の置換は{1..$n}
必要に応じて機能しません。避けるべき良い理由eval
。簡単な解決策は、ファイル名を変更して順番に並べ替えることです。
次の文書を検討してください。
$ ls
page_10.jpg page_1.jpg page_2.jpg page_3.jpg page_4.jpg page_5.jpg page_6.jpg page_7.jpg page_8.jpg page_9.jpg
1桁のファイル名の前に0を追加すると、必要に応じてファイル名を並べ替えることができます。
$ for f in ./page_[0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
$ ls
page_01.jpg page_02.jpg page_03.jpg page_04.jpg page_05.jpg page_06.jpg page_07.jpg page_08.jpg page_09.jpg page_10.jpg
これで、次のものを使用できます。
convert *.jpg out.pdf
2桁の数字を3桁の数字に変換
〜のようにスミットリンク上記を拡張して2桁の数字を3桁の数字に変換できることに注意してください。
for f in ./page_[0-9][0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
たとえば、上記のファイルを使用すると、次のようになります。
$ for f in ./page_[0-9][0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
$ ls
page_001.jpg page_002.jpg page_003.jpg page_004.jpg page_005.jpg page_006.jpg page_007.jpg page_008.jpg page_009.jpg page_010.jpg
答え3
eval
中括弧拡張は変数置換の前に実行されるため、逆の場合は次のものが必要です。
eval convert page_{1..$N}.jpg out.pdf
別の方法は、拡張ファイル名をソートすることです。
convert $(echo page_*.jpg | tr ' ' '\n' | sort -n -k 2 -t _) out.pdf