共有フォルダが複数あり、ユーザーがそこに複数のフォルダを持っていることを確認する必要があります。たとえば、
/shared/release/
/shared/compile/
/shared/tags/
/shared/general/
これらのフォルダを一覧表示し、ユーザーが2つ以上のフォルダを所有していることを知らせるbashスクリプトが必要です。
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
find
これにはGNUサポートが必要です-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で区切られた入力を使用するように指示します。これにより、ディレクトリ名に改行やその他の難しい文字が含まれていてもプロセスが安全になります。