Bash中括弧拡張で変数を使用する

Bash中括弧拡張で変数を使用する

次の順序でさまざまな数の写真を生成するプログラムがあります。 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

関連情報