Linux
列印缺少 .txt 文件類型的文件夾
我在父目錄中有 150 個目錄。其中一些有
.txt
文件,另一些則沒有。我想列印哪些文件夾沒有.txt
文件。我怎樣才能做到這一點?
for dir in */; do set -- "$dir"/*.txt [ ! -e "$1" ] && printf '%s\n' "$dir" done
這將遍歷目前目錄中的所有目錄。對於每個目錄,它會嘗試擴展一個匹配
.txt
該目錄中所有文件的文件名通配模式,使用set
. 這會將位置參數($1
、$2
等)設置為與模式匹配的文件的路徑名,或者$1
如果它不匹配任何內容,則僅設置為模式本身。如果該文件名擴展的第一個結果不是現有文件的路徑名,則列印目錄名。要對目前目錄(包括目前目錄)中的所有目錄遞歸執行此操作:
find . -type d -exec sh -c ' for dir do set -- "$dir"/*.txt [ ! -e "$1" ] && printf "%s\n" "$dir" done' sh {} +
這
find
用作目錄路徑名的生成器。對於批量找到的目錄路徑名,執行與之前相同的循環,列印每個目錄的路徑名,其中不包含任何名稱以.txt
.請注意,以上兩段程式碼都將檢測到不存在任何以
.txt
. 如果您只對正常文件(或正常文件的符號連結)感興趣,請使用以下內容作為循環體:while [ "$#" -gt 0 ] && [ ! -f "$1" ]; do shift done [ ! -e "$1" ] && ...as above...
要包含隱藏文件名,請使用,例如,
bash -O dotglob -c
代替sh -c
withfind
。這將使 shell 循環中的文件名萬用字元也考慮以點開頭的名稱。在第一個變體中,如果您正在執行循環,請確保將dotglob
shell 選項設置為.shopt -s dotglob``bash