Bash 如何按路径索引所有者/组并在以后应用它们?
我的目标是在整个文件系统中运行,获取绝对路径、文件所有者和文件组,并将它们存储在一个文件中,供以后与脚本一起使用,以便对“已知”文件重新应用所有权 注意:需要安装“acl”软件包 以下是我目前掌握的情况: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 问题是,我得到以下
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