Bash

使用具有預定義範圍的萬用字元序列列出編號文件

  • September 21, 2017

我有一個編號數據文件的文件夾。我正在嘗試逐步提取預定義的文件範圍。我要查找的文件範圍是在兩個變數 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

引用自:https://unix.stackexchange.com/questions/285184