shell glob 中的“或”

shell glob 中的“或”

我想 ls 檔案名稱中包含子字串「s1r」、「s2r」、「s3r」或「s19r」的檔案。

我快到了!

拙劣的嘗試:

ls *s[123][9?]r*

上面只給我包含子字串的文件

s19r

儘管

ls *s[1-3]|[19]r*

回報

-bash: [19]r*: 未找到指令

ls: *s[1-3]: 沒有那個檔案或目錄

也就是說,它不識別或 |運算符 - 這是有道理的,因為它也用於管道。

如何取得包含「s1r」、「s2r」、「s3r」或「s19r」的檔案?

答案1

使用ls *s1r* *s2r* *s3r* *s19r*

如果您關心不存在的文件,您可以設定 nullglob 選項:

          nullglob
                  If  set,  bash allows patterns which match no files (see
                  Pathname Expansion above) to expand to  a  null  string,
                  rather than themselves.

如果你的 shell 不是 bash,可能有類似的方法。看看它的手冊頁。

答案2

你可能想嘗試這個:

ls *s?([123])r* *s19r*

例如

我有一個包含以下文件的目錄:

% ls | column
s10r    s12r    s14r    s16r    s18r    s1r s2r s4r s6r s8r
s11r    s13r    s15r    s17r    s19r    s23r    s3r s5r s7r s9r

使用上面提到的 ls:

% ls *s?([123])r* *s19r*
s19r  s1r  s2r  s3r

請參閱bash 模式匹配手冊更多細節。

相關內容