測試一個glob是否在bash中有任何匹配如果我想檢查是否存在單個文件,我可以使用test -e filename或測試它[ -e filename ]。假設我有一個glob,我想知道是否存在名稱與glob匹配的文件。glob可以匹配0個文件(在這種情況下我不需要做任何事情),或者它可以匹配1個或多個文件(在這種情況下我需要做一些事情)。如何測試glob是否有匹配?(我不關心有多少匹配,如果我能用一個if語句而沒有循環(僅僅因為我發現最可讀)這樣做是最好的。(test -e glob*如果glob匹配多個文件,則失敗。)
3 回答

阿晨1998
TA貢獻2037條經驗 獲得超6個贊
Bash特定解決方案:
compgen -G "<glob-pattern>"
逃離模式或它將被預先擴展為匹配。
退出狀態是:
1表示不匹配,
0表示“一場或多場比賽”
stdout
是與glob匹配的文件列表。
我認為這是簡潔性和最小化潛在副作用的最佳選擇。
更新:請求的示例用法。
if compgen -G "/tmp/someFiles*" > /dev/null; then echo "Some files exist."fi

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
nullglob shell選項確實是一種基礎。
為了避免需要對nullglob狀態進行繁瑣的保存和恢復,我只在擴展glob的子shell中設置它:
if test -n "$(shopt -s nullglob; echo glob*)"then echo foundelse echo not foundfi
為了更好的可移植性和更靈活的通配,請使用find:
if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)"then echo foundelse echo not foundfi
顯式-print -quit操作用于查找而不是默認的隱式-print操作,以便find在找到與搜索條件匹配的第一個文件后立即退出。在大量文件匹配的情況下,這應該比echo glob*
或者運行得快得多,ls glob*
并且它還避免了擴展命令行過度填充的可能性(一些shell具有4K長度限制)。
如果發現感覺像是矯枉過正,并且可能匹配的文件數量很少,請使用stat:
if stat -t glob* >/dev/null 2>&1then echo foundelse echo not foundfi
添加回答
舉報
0/150
提交
取消