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