Bash
使用具有預定義範圍的萬用字元序列列出編號文件
我有一個編號數據文件的文件夾。我正在嘗試逐步提取預定義的文件範圍。我要查找的文件範圍是在兩個變數 ns 和 ne 中預定義的,它們會隨著程式碼的執行而變化。
我一直在嘗試類似以下的事情:
$ 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 符合預期。
我認為我在使用排序時犯了一個基本錯誤,但希望有人告訴我這個錯誤是什麼。
非常感謝。
大括號擴展發生在變數擴展之前,因此無法在其中使用變數。您可以
seq
改用:seq -f foo_%03.0f.nc $ns $ne
請注意,這
{1..20}
不是萬用字元/萬用字元運算符。這是一種特殊形式的大括號擴展,由and引入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
還有一個萬用字元/萬用字元運算符來匹配十進制數字範圍。ls -d foo_<1-30>.nc
將擴展到匹配文件列表。如果要將其限制為 4 位 0 填充的,則需要另一個運算符:
ls -d foo_(<1-30>~^????).nc # needs extendedglob
(
~
is except ( and-not ),^
is not , so~^
is and-not-not , so and )。該
<x-y>
運算符不適用於變數(因為它與重定向運算符重疊,它僅在遵循<[digits]-[digits]>
模式時才有效,以避免與重定向衝突)。但是,您可以使用此語法來解決它:ls -d ${~:-foo_<$ns-$ne>.nc}
或者更清楚地說:
pattern="foo_<$ns-$ne>.nc" ls -d $~pattern