Bash

在 Bash if 條件下,如何檢查是否存在與簡單萬用字元表達式匹配的文件?

  • January 23, 2015

愚蠢的是,我一直在使用這樣的條件作為腳本的一部分:

if [ $(ls FOO* 2> /dev/null) ] # if files named "FOO*" were downloaded 
then
   echo "Files found" 
   # ... process and email results
else
   echo "Not found"
   # ... email warning that no files were found (against expectations)
fi

這適用於零個和一個名為的文件FOO*,但如果有多個. 從日誌中我發現了幾個不同的錯誤消息:

[: FOO_20131107_082920: unary operator expected
[: FOO_20131108_070203: binary operator expected
[: too many arguments

我的問題是:在 Bashif條件下檢查一個或多個名稱以開頭的文件是否FOO存在的正確方法是什麼?

GNU bash,版本 4.2.25(1)-release (x86_64-pc-linux-gnu)

發生這種情況是因為您對 ls 的命令替換輸出了空格,並且在傳遞給[. 一種不易損壞的方法是將文件放在一個數組中,然後檢查該數組是否至少有一個成員。

shopt -s nullglob

files=( FOO* )
if (( ${#files[@]} )); then
   # there were files
fi

這是因為((預設情況下,如果值不等於 0,則返回 true,並${#files[@]}獲取數組中的項目數(如果有與 glob 匹配的文件,則將 >0)。

只要nullglob未設置,您也可以執行以下操作:

if ls FOO* >/dev/null 2>&1; then
   # there were files
fi

這只是檢查 的退出程式碼ls,如果您傳遞了一個不存在的文件名,則該程式碼將為 1(文字FOO*,如果沒有匹配項(當然,除非您是邪惡的並且有一個名為 的文件FOO*,在這種情況下它將返回 0 :-) ))。

請注意,這兩個也匹配目錄。如果您真的只想匹配正常文件,則需要測試:

for file in FOO*; do
   if [[ -f $file ]]; then
       # file found, do some stuff and break
       break
   fi
done

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