Linux

列印缺少 .txt 文件類型的文件夾

  • March 16, 2019

我在父目錄中有 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 -cwith find。這將使 shell 循環中的文件名萬用字元也考慮以點開頭的名稱。在第一個變體中,如果您正在執行循環,請確保將dotglobshell 選項設置為.shopt -s dotglob``bash

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