Linux
bash + 測試文件夾是否為空但排除帶有前導點的文件
我們使用以下方法來驗證文件夾是否為空:
[[ "$(ls -A /var/folder)" ]] && echo "not empty"
上
/var/folder
,我們做了以下事情:ls -l /var/folder total 0
實際上我們沒有得到任何輸出。
但是當我們執行 shell 時
[[ "$(ls -A /var/folder)" ]] && echo "not empty"
然後它列印
not empty
所以我們發現該文件夾包含帶有前導點的文件,如下所示:
ls -la /var/folder total 4 drwxr-xr-x 2 kafka kafka 47 Jan 19 17:23 . drwxr-xr-x 42 kafka kafka 4096 Jan 19 10:25 .. -rw-r--r-- 1 kafka kafka 0 Jan 19 17:22 .kafka_cleanshutdown -rw-r--r-- 1 kafka kafka 0 Jan 19 15:16 .lock
所以問題是如何驗證文件夾是否為空但忽略以“。”開頭的文件的存在。
如果您不想看到點文件,請不要使用
-A
![[ "$(ls /var/folder)" ]] && echo "not empty"
但是您甚至不需要使用
ls
; 您可以完全在 shell 中執行此操作:file_list=(/var/folder/*) [[ "${file_list[*]}" != "/var/folder/*" ]] && echo "not empty"
這擴展了
/var/folder/*
萬用字元模式(“glob”)。如果有非隱藏文件,則將file_list
列出它們的名稱。如果沒有,那麼file_list
將只是文字 string/var/folder/*
。這有一個錯誤:如果目錄包含一個名稱為字面意思的文件
*
,那麼${file_list[*]}
將是文字字元串/var/folder/*
,上面的程式碼將失敗(表明目錄為空)。你可以通過這樣做來解決這個問題shopt -s nullglob file_list=(/var/folder/*) [[ "${file_list[*]}" != "" ]] && echo "not empty" shopt -u nullglob
當然,健壯的腳本會
nullglob
在開始時檢查設置,然後在結束時恢復該設置,而不僅僅是取消設置。這是為 bash 編寫的,不適用於所有 shell。