Linux

查找使用者擁有的文件夾

  • September 29, 2016

我有幾個共享文件夾,我需要查找使用者那裡是否有多個文件夾。例如:

/shared/release/
/shared/compile/
/shared/tags/
/shared/general/

我需要一個 bash 腳本來列出這些文件夾並告訴我使用者擁有的文件夾是否超過 1 個。

使用 bash,我如何獲取這些文件夾的列表並確定使用者是否擁有多個文件夾?

這將顯示哪些使用者擁有多個目錄:

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。為了解決這個問題,我們需要支持 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>擁有的文件(目錄)

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