Bash 如何按路径索引所有者/组并在以后应用它们?

Bash 如何按路径索引所有者/组并在以后应用它们?,bash,find,paste,Bash,Find,Paste,我的目标是在整个文件系统中运行,获取绝对路径、文件所有者和文件组,并将它们存储在一个文件中,供以后与脚本一起使用,以便对“已知”文件重新应用所有权 注意:需要安装“acl”软件包 以下是我目前掌握的情况: find / -exec ./fileog.sh {} \; ./fileog.sh的内容: getfacl -R "$2" | awk 'NR==1, NR==3 {print $3}' | paste -s -d ',' >> ./ogindex.txt 问题是,我得到以下

我的目标是在整个文件系统中运行,获取绝对路径、文件所有者和文件组,并将它们存储在一个文件中,供以后与脚本一起使用,以便对“已知”文件重新应用所有权

注意:需要安装“acl”软件包

以下是我目前掌握的情况:

find / -exec ./fileog.sh {} \;
./fileog.sh的内容:

getfacl -R "$2" | awk 'NR==1, NR==3 {print $3}' | paste -s -d ',' >> ./ogindex.txt
问题是,我得到以下错误:

getfacl: : No such file or directory
但如果我这么做,它会起作用:

find / -exec getfacl -R "$2" {} \;
你自己试试看:)


我遗漏了什么?

您在
查找
中运行
fileog.sh
,只给他一个参数(文件名,
{}
):

此文件名在脚本中可作为
$1
访问,而不是
$2
访问

您必须在脚本中写入
$1
而不是
$2
,或者必须在
-exec
中将缺少的参数添加到脚本中

ogeindex.txt的片段

etc,root,root
etc/ucf.conf,root,root
etc/gshadow,root,shadow
etc/sudoers.d,root,root
etc/sudoers.d/README,root,root
etc/motd.tail,root,root

您不应该同时使用
find
getfacl-R
,否则您应该更加小心地使用它们

find
已经递归,因此您要以这种方式多次命中每个文件

我会这样解决问题:

find / -exec stat -c '%n,%U,%G' {} \; >> ./ogindex.txt
如果您需要删除前导的
/
,这将是一个很小的后期处理

注:假定
stat
支持通过
-c
格式化;并非所有版本的
stat
都相同


另外,我强烈建议您不要以这种格式存储此信息。如果文件名中有逗号,会发生什么情况?如果使用
用户、组、文件名
会更安全,因为您可以将第二个逗号后的所有内容都作为文件名。当然,这仍然容易受到精心编制的文件名的攻击。

您的
getfacl
调用
fileog.sh
不应该是
getfacl-R“$1”
而不是
getfacl-R“$2”
?你只传递了一个论点…谢谢你抓住了那个愚蠢的错误!现在如果我运行
find/-exec./fileog.sh{}仅输出错误。但如果我在“find”中指定和绝对路径(或通配符),它将正常工作。有什么建议吗?是的,一定是这样
find
对找到的每个文件执行
/fileog.sh
,不打印其名称。无论如何都会执行脚本。但如果您想打印找到的文件名,只需在
-exec
之前添加
-print
-print-exec…\
正确,但是./fileog.sh应该将名称打印为输出的第一行:
#file:/boot/initrd.img
@Nobody:添加了输出示例非常感谢!这是如此多的清洁,只有1班轮!这还有一个副作用,就是跑得更快。在旧版的大约一半运行时间里,我已经超过了它的运行时间。@Nobody:想再快一点吗?如果不需要任何后处理,请替换
\+
进行编码>。这可以将多个文件传递到
stat
,从而节省一些开销。仅供参考,我的一个方框上的一个小基准显示
stat
ing
/etc/
with
\需要18秒,但使用
+
只需要
0.447
秒。是的,这就是缓存的所有内容。
etc,root,root
etc/ucf.conf,root,root
etc/gshadow,root,shadow
etc/sudoers.d,root,root
etc/sudoers.d/README,root,root
etc/motd.tail,root,root
find / -exec stat -c '%n,%U,%G' {} \; >> ./ogindex.txt