我正在嘗試使用擴展的 glob bash -c
,但還沒有找到讓它工作的方法。
我嘗試過的事情
bash -c 'for f in *.!(ext); do echo $f; done'
結果:
bash: -c: line 0: syntax error near unexpected token `('
bash -c 'for f in *.!\(ext\); do echo $f; done'
結果:
*.!(ext)
bash -c 'for f in *.!$0; do echo $f; done' '(ext)'
結果:
*.!(ext)
bash -c 'for f in "*.!(ext)"; do echo $f; done'
結果:
*.!(ext)
答案1
若要在 中使用擴充的通配模式bash
,您必須extglob
以一種或另一種方式啟用 shell 選項。
對於內聯腳本執行此操作的最簡單方法是使用命令列上的選項bash -c
設定 shell 選項:-O
bash -O extglob -c 'script code here'
您也可以直接致電shopt -s extglob
在腳本內,但您必須確保這是在單獨的行上完成的,因為它改變了 shell 解析程式碼的方式(它修改了 shell 的語法):
bash -c 'shopt -s extglob
script code here'
至於列印所有不以字串結尾的名稱的實際任務.ext
:
bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'
透過另外設定dotglob
和nullglob
選項,腳本將匹配隱藏名稱,如果沒有匹配,將列印一個空白行(而不是列印未展開的模式)。
請注意,您的模式將排除以(不僅僅是)*.!(ext)
結尾的檔名ext
.ext
和不包含點的檔名。