数字順のグローブ

数字順のグローブ

私のディレクトリには、次の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 -vGNU 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?.pdfc0.pdf c1.pdf… …に展開しますc9.pdf。 ...c??.pdfに拡張されます(該当する場合は最大に拡張されます)。パス名拡張文字を含む各コマンドラインワードは、変数に従ってソート(組み合わせ)されたファイル名のリストに展開されますが、隣接するワイルドカード(ワイルドカード)拡張によるリストはマージされません。 (シェルのマニュアルページにこの内容が明示的に明示されていましたが、今は見つかりませんでした。)c10.pdf c11.pdfc20.pdfc99.pdfLC_COLLATE

もちろん、ファイルにアクセスできる場合は、c999.pdfそのファイルを使用する必要がありますc?.pdf c??.pdf c???.pdf。もちろん数字が多ければ退屈になります。たとえば、最大5桁の場合は、このオプションを設定c?{,?{,?{,?{,?}}}}.pdfできますc0.pdf。それ以外の場合(たとえば、2桁の数字を含むファイルがない場合)、プログラムにリテラル引数が渡されます。c12345.pdfnullglobc??.pdf

プレフィックスが複数ある場合(たとえば、、および、1桁または2桁の数字など)、明らかな無差別アプローチを使用できます。a<number>.pdfb<number>.pdfc<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つがうまくいかない場合は、別のことを試してください)

関連情報