Ubuntuの各ユーザーに対して複数の別々のリストを作成したいと思います。リストには、各ユーザーに属するファイルとフォルダが含まれています。
システムのすべてのユーザーを一覧表示するには、次のコマンドを使用します。
cat /etc/passwd | awk -F: '{print $1;}'
「user1」が最初の結果であると仮定すると、私が得たいリストは次のようになります。
find / -user "user1" > user1.txt
だから私の質問は、できるだけ少ない数のコマンドを使用してすべてのリストを取得する方法です。よろしくお願いします。
答え1
getent passwd | cut -d: -f1 | while read USER ; do
echo $USER #use this to show some kind of progress otherwise delete this string
find / -user $USER > ${USER}.txt 2>/dev/null
done
PS:詳細については、以下を確認してください。シェルループ。
しかし、これは非常に悪い考えです。find
ユーザー数だけファイルシステム全体で実行する必要があります。
私たちはよりスマートになり、他の方法で作業を行います。find
一度だけ実行し、出力を次のファイルに分割します。
find / -printf "%u %p\n" | awk '{print $2 > $1".txt"}'
答え2
少なくともGNU findには、-fprint
次のイディオムを使用してファイルシステムを一度だけ通過することで目的を達成するためのバリエーションがありますfind path -user user1 -fprint user1.txt
。
まず生成し-user
、-fprint
パラメータを指定します。
findargs=""
for user in $(cut -d: -f1 /etc/passwd); do
if [[ -z $findargs ]]; then
findargs="-user $user -fprint $user.txt";
else
findargs="$findargs -or -user $user -fprint $user.txt"
fi
done
これでファイルシステムを解析する準備が整いました。
find path/to/parse $findargs