在嘗試回答這個問題時,我想出了這個解決方案,它有效:
#!/bin/bash
testor=$(shopt | grep extglob | awk '{ print $2 }' )
if [ "${testor}" = "off" ]
then
shopt -s extglob
shopt | grep extglob
fi
ls ./WORKS/@(*.sh|*.dat|*.txt)
輸出是這樣的:
ericthered@OasisMega1:/0__WORK$ ./junk_37.sh
extglob on
./WORKS/abc_junk_def.txt ./WORKS/junk_007.sh ./WORKS/junk_28.sh
./WORKS/assignListToBashArray.sh ./WORKS/junk_008.sh ./WORKS/junk_28.txt
./WORKS/awkEmbeddedFunction.sh ./WORKS/junk_009.sh ./WORKS/junk_29.dat
./WORKS/droneConnectWiFi.sh ./WORKS/junk_010.sh ./WORKS/junk_29.sh
./WORKS/expandNumericDirectories.sh ./WORKS/junk_011.sh ./WORKS/junk_30.sh
./WORKS/findMatchOnEmbeddedFilename.sh ./WORKS/junk_012.sh ./WORKS/junk_31.sh
./WORKS/junk_001.sh ./WORKS/junk_013.sh ./WORKS/musicplayer.sh
./WORKS/junk_002.sh ./WORKS/junk_014.sh ./WORKS/prototypeEditorWrapper.sh
./WORKS/junk_003.sh ./WORKS/junk_015.sh ./WORKS/prototypeSendmailWrapper.sh
./WORKS/junk_004.sh ./WORKS/junk_26.dat ./WORKS/reportNotLowercase.sh
./WORKS/junk_005.sh ./WORKS/junk_26.sh
ericthered@OasisMega1:/0__WORK$
但是......如果相反,我使用以下行,
ls @(./WORKS/*.sh|./WORKS/*.dat|./WORKS/*.txt)
它報告此錯誤:
ls: cannot access '@(./WORKS/*.sh|./WORKS/*.dat|./WORKS/*.txt)': No such file or directory
我很感激有人提供關于為什么這兩種形式不等價的見解。
uj5u.com熱心網友回復:
根據POSIX,目錄分隔符必須在檔案名擴展中顯式匹配;即*, ?,[...]等不匹配/。出于同樣的原因,以下內容也不起作用。
$ ls ./WORKS[/]*.sh
ls: cannot access './WORKS[/]*.sh': No such file or directory
$ ls ./WORKS*.sh
ls: cannot access './WORKS*.sh': No such file or directory
uj5u.com熱心網友回復:
將我之前的評論轉換為答案,以便將來的訪問者輕松找到該解決方案。
中的模式extglob不適用于/:
cd WORKKS
# reason of failure, presence of / in glob pattern
ls @(./junk_001.sh)
No such file or directory
# this will work fine with omission of /
ls @(junk_001.sh)
junk_001.sh
使用以下方法解決您的問題的解決方法extglob:
(cd WORKS; ls @(*.sh|*.dat|*.txt))
# or use find with regex
find WORKS -regextype awk -regex '.*/[^.]*\.(sh|dat|txt)$'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524807.html
標籤:重击球体
上一篇:bash-4.4$指的是什么?
