Linux
查找使用者擁有的文件夾
我有幾個共享文件夾,我需要查找使用者那裡是否有多個文件夾。例如:
/shared/release/ /shared/compile/ /shared/tags/ /shared/general/
我需要一個 bash 腳本來列出這些文件夾並告訴我使用者擁有的文件夾是否超過 1 個。
使用 bash,我如何獲取這些文件夾的列表並確定使用者是否擁有多個文件夾?
這將顯示哪些使用者擁有多個目錄:
find /shared -type d -printf '%u\n' | sort | uniq -dc
這需要 GNU
find
來支持該-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
。為了解決這個問題,我們需要支持 NUL 分隔輸入的 GNU awk 或最新版本的 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 分隔的輸入。即使目錄名稱包含換行符或其他困難字元,這也使過程安全。
使用
find
:find /shared -mindepth 1 -maxdepth 1 -type d -user <username>
替換
<username>
為您要查找的實際使用者名。
-maxdepth 1
將防止遞歸遍歷,即只查看/shared
目錄-mindepth 1
如果由 擁有,將阻止列出/shared
目錄本身<username>
,如果您不希望此行為刪除此選項-type d
表示我們只對目錄感興趣-user <username>
表示我們正在尋找<username>
擁有的文件(目錄)