Linux

bash + 測試文件夾是否為空但排除帶有前導點的文件

  • January 19, 2022

我們使用以下方法來驗證文件夾是否為空:

[[ "$(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。

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