Bash

如何在可執行參數中載入超過 10 個範圍的文件?

  • April 20, 2021

我有這個工作命令行表達式:

program --files path_to_mydir/mydata_[0-9].csv

我想離開,[0-100]但這不起作用。

program --files path_to_mydir/mydata_[0-100].csv

另外,額外問一下,你怎麼稱呼[0-10]wrt shell 腳本和 bash 腳本?

謝謝

編輯:雖然類似這個問題不是問ls

[...]一個括號表達式。它始終匹配單個字元,因此您不能使用[0-100]它,因為它只會匹配單個01(在 POSIX 語言環境中)

zshshell 中,您可以使用<0-100>數值範圍通配模式,但這不適用於bash

program --files path_to_mydir/mydata_<0-100>.csv

bash中,您可以改用大括號擴展:

program --files path_to_mydir/mydata_{0..100}.csv

但是您必須注意這與文件名通配模式之間的區別。一個大括號擴展,就像上面的那個一樣,生成字元串,不管有什麼文件名可用,而文件名通配模式匹配現有的名稱。這意味著大括號擴展可能會為您的程序提供不存在的文件名。

可以使用[...]0 到 100 之間的數字來匹配文件,但您必須將其設為三種模式,每種模式對應一種數字長度:

shopt -s nullglob

program --files \
   path_to_mydir/mydata_[0-9].csv \
   path_to_mydir/mydata_[1-9][0-9].csv \
   path_to_mydir/mydata_[1][0][0].csv

第一個匹配包含數字0到 to9的名稱,第二個匹配包含10到 to的名稱99,最後一個匹配包含 的名稱100

你想匹配零填充的整數:

shopt -s nullglob

program --files \
   path_to_mydir/mydata_[0][0-9][0-9].csv \
   path_to_mydir/mydata_[1][0][0].csv

nullglob在此程式碼的兩種變體中都設置了 shell 選項,以確保刪除與任何名稱不匹配的任何模式,並且不會未展開。


使用者 fra-san 注意到您可以將上面的大括號擴展與強制 shell 觸發 globbing 模式匹配的東西結合使用:

shopt -s nullglob
program --files path_to_mydir/[m]ydata_{0..100}.csv

在字元串中包含[m](與字元 匹配的模式m)將強制 shell 將大括號擴展創建的每個字元串視為單獨的通配模式。由於我們使用nullglob,與現有名稱不對應的模式將從參數列表中刪除。

請注意,這將生成並擴展 101 個通配模式,而在此答案中使用通配的其他方法使用兩個或三個模式。

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