
私のディレクトリには、次のPDFファイルのリストがあります。
c0.pdf c12.pdf c15.pdf c18.pdf c20.pdf c4.pdf c7.pdf
c10.pdf c13.pdf c16.pdf c19.pdf c2.pdf c5.pdf c8.pdf
c11.pdf c14.pdf c17.pdf c1.pdf c3.pdf c6.pdf c9.pdf
Ghostscriptを使用して数字順にそれらをリンクしたいと思います(これに似ています)。
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf *.pdf
しかし、シェル拡張順序は、数字の自然順序ではなくアルファベット順序を再現します。
$ for f in *.pdf; do echo $f; done
c0.pdf
c10.pdf
c11.pdf
c12.pdf
c13.pdf
c14.pdf
c15.pdf
c16.pdf
c17.pdf
c18.pdf
c19.pdf
c1.pdf
c20.pdf
c2.pdf
c3.pdf
c4.pdf
c5.pdf
c6.pdf
c7.pdf
c8.pdf
c9.pdf
拡張子で目的の順序をどのように達成できますか(可能であれば、0
ファイル名の数字に-paddingを手動で追加せずに)?
使用法の提案を見つけましls | sort -V
たが、私の特定のユースケースに合わせて機能させることはできません。
答え1
また、zshのglob修飾子救助に来てください。
echo *.pdf(n)
答え2
環境に応じてls -v
GNU coreutilsを使用できます。たとえば、次のようになります。
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=out.pdf $(ls -v)
または、最新バージョンのFreeBSDまたはOpenBSDを使用している場合:
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=out.pdf $(ls | sort -V)
答え3
すべての関連ファイルに同じプレフィックスがある場合(たとえば、番号の前のテキスト、c
この場合)、次のものを使用できます。
GS …パラメータ… c?.pdf c??.pdf
c?.pdf
c0.pdf
c1.pdf
… …に展開しますc9.pdf
。 ...c??.pdf
に拡張されます(該当する場合は最大に拡張されます)。パス名拡張文字を含む各コマンドラインワードは、変数に従ってソート(組み合わせ)されたファイル名のリストに展開されますが、隣接するワイルドカード(ワイルドカード)拡張によるリストはマージされません。 (シェルのマニュアルページにこの内容が明示的に明示されていましたが、今は見つかりませんでした。)c10.pdf
c11.pdf
c20.pdf
c99.pdf
LC_COLLATE
もちろん、ファイルにアクセスできる場合は、c999.pdf
そのファイルを使用する必要がありますc?.pdf c??.pdf c???.pdf
。もちろん数字が多ければ退屈になります。たとえば、最大5桁の場合は、このオプションを設定c?{,?{,?{,?{,?}}}}.pdf
できますc0.pdf
。それ以外の場合(たとえば、2桁の数字を含むファイルがない場合)、プログラムにリテラル引数が渡されます。c12345.pdf
nullglob
c??.pdf
プレフィックスが複数ある場合(たとえば、、および、1桁または2桁の数字など)、明らかな無差別アプローチを使用できます。a<number>.pdf
b<number>.pdf
c<number>.pdf
a?.pdf a??.pdf b?.pdf b??.pdf c?.pdf c??.pdf
または{a,b,c}?{,?}.pdf
。
答え4
Thorの答えを引用して修正するだけです。 lsを解析しないでください!
sort -V
(ソートのためにPOSIXではなく拡張)を使用できます。
printf '%s\0' ./* | sort -zV \
| xargs -0 gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH \
-sDEVICE=pdfwrite -sOutputFile=out.pdf
(一部のコマンドの場合はgsの場合は「./「変える」「…1つがうまくいかない場合は、別のことを試してください)