事前定義された範囲でワイルドカードシーケンスを使用して番号付きファイルを一覧表示する

事前定義された範囲でワイルドカードシーケンスを使用して番号付きファイルを一覧表示する

番号付きデータファイルを含むフォルダがあります。事前定義されたファイル範囲を段階的に抽出しようとしています。私が探しているファイルの範囲は、コードが実行されるにつれて変更されるnsとneという2つの変数で事前定義されています。

私は次のことを試してきました。

$ ns=0001
$ ne=0030

$ ls foo_{$ns..$ne}.nc

{$ns..$ne}しかし、これはシーケンスとして読み込まれず、エラーを返します。

ls: cannot access foo_{0001..0030}.nc: No such file or directory

同じコマンドを入力して数値を手動で入力すると、期待どおりに0001から0030までの数字を含むファイルのリストが表示されます。

私はシーケンシングを使って基本的なミスをしていると思いますが、誰かがミスが何なのか教えてほしいです。

とても感謝しています。

答え1

中括弧拡張は変数拡張の前に発生するため、その中で変数を使用することはできません。あなたはそれを使用することができますseq

seq -f foo_%03.0f.nc $ns $ne

答え2

これは{1..20}ワイルドカード/ワイルドカード演算子ではありません。これはおよびによって導入されコピーされた特別な形の支柱の拡張ですが、zsh制限とksh93変更がありますbash

foo_{0001..0030}.nc一致するファイルのリストに展開されず、ファイルが存在するかどうかにかかわらずfoo_0001.nc、、、foo_0002.nc...に展開されます。foo_0030.nc

bash内容を変更できないという制限があります。ksh93そしてzshそのような制限はありません。

したがって、ls -d foo_{$ns..$ne}.ncこのシェルでも機能します。

zsh10進数の範囲に一致するワイルドカード/ワイルドカード演算子もあります。

ls -d foo_<1-30>.nc

一致するファイルのリストに展開されます。 4桁の0パディング数に制限するには、他の演算子が必要です。

ls -d foo_(<1-30>~^????).nc # needs extendedglob

~はいとは別にまさか)、^はいいいえ、やはり~^そうです。チペイフェイだから、そして)。

ただし、この演算子は変数と連携しません(リダイレクト演算子と重複するため、可能な限りリダイレクトとの競合を避けるためにパターンに従う<x-y>場合にのみ機能します)。<[digits]-[digits]>ただし、次の構文を使用して問題を解決できます。

ls -d ${~:-foo_<$ns-$ne>.nc}

またはもう少し明確に言えば、

pattern="foo_<$ns-$ne>.nc"
ls -d $~pattern

関連情報