
番号付きデータファイルを含むフォルダがあります。事前定義されたファイル範囲を段階的に抽出しようとしています。私が探しているファイルの範囲は、コードが実行されるにつれて変更される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
このシェルでも機能します。
zsh
10進数の範囲に一致するワイルドカード/ワイルドカード演算子もあります。
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