我想为 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
附注欲了解更多信息,请查看外壳循环。
然而,这是一个非常糟糕的主意:您需要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