尋找使用者擁有的資料夾

尋找使用者擁有的資料夾

我有幾個共享資料夾,我需要查找用戶是否有多個資料夾。例如:

/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 分隔的輸入。即使目錄名稱包含換行符或其他困難字符,這也使進程安全。

相關內容