我有幾個共享資料夾,我需要查找用戶是否有多個資料夾。例如:
/shared/release/
/shared/compile/
/shared/tags/
/shared/general/
我需要一個 bash 腳本來列出這些資料夾並告訴我使用者是否擁有超過 1 個資料夾。
使用 bash,如何取得這些資料夾的清單並確定使用者是否擁有多個資料夾?
答案1
使用find
:
find /shared -mindepth 1 -maxdepth 1 -type d -user <username>
替換<username>
為您要尋找的實際使用者名稱。
-maxdepth 1
將防止遞歸遍歷即只會查看/shared
目錄-mindepth 1
/shared
如果擁有的話,將阻止列出目錄本身<username>
,如果您不希望此行為,請刪除此選項-type d
表示我們只對目錄感興趣-user <username>
表示我們正在尋找<username>
擁有的檔案(目錄)
答案2
這將顯示哪些使用者擁有多個目錄:
find /shared -type d -printf '%u\n' | sort | uniq -dc
這需要GNUfind
支援該-printf
行動。你的 CentOS 會有這個。
這將列出具有多個目錄的使用者及其目錄:
find /shared -type d -printf '%u %p\0' | awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"
為了獲得最大的靈活性,我們使用了 NUL 分隔的輸出find
。為此,我們需要 GNU awk 或支援 NUL 分隔輸入的最新版本的 mawk。由於您使用的是 CentOS,所以這應該沒問題。
怎麼運作的
find /shared -type d -printf '%u %p\0'
這告訴 find在 NUL 分隔的清單中尋找
/shared
並列印出其所有者%u
以及目錄名稱。%p
awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"
這會計算每個使用者擁有的目錄數量,並為擁有多個目錄的使用者列印一份報告。更詳細地說:
c[$1]++
增加第一個輸入欄位中指定的使用者的計數。a[$1]=a[$1](a[$1]?"\n ":"")$0}
儲存為此使用者找到的每個目錄的名稱。END{for (user in c) if (c[user]>1) print c[user],a[user]}
列印出報告。RS="\0"
告訴awk
使用 NUL 分隔的輸入。即使目錄名稱包含換行符或其他困難字符,這也使進程安全。