我已接手 RHEL5 脚本编写工作,但我没有接受过任何有关此平台或 bash 脚本编写的培训。有一个脚本包含多个部分,我只会询问第二部分,但也会向您展示第一部分,因为我认为这将有助于解答我下面的问题。
脚本的第一部分显示特定服务器上用户的输出:
cut -d : -f 1 /etc/passwd
输出结果如下:
root
bin
joe
rob
other...
第二个脚本要求我填写上面脚本中列出的每个帐户并运行。从我收集的信息以及我在手册页和其他网络搜索中的搜索来看,它会查找文件或目录的组所有者,并显然会排序并挑选出唯一的记录,但不太确定 - 所以这就是我的问题,下面的脚本到底是做什么的?(有趣的是,如果我从上面的输出中插入每个名称,我有时会收到“找不到用户名等等”的消息。)
find
username
-printf %G | sort | uniq
答案1
如果您查看find
手册页,您会发现该选项的描述-printf
:
-printf format
True; print format on the standard output, interpreting `\' escapes
and `%' directives...
如果您进一步查看手册页,您将找到以下文档%G
:
%G File's numeric group ID.
因此,这将查找目录中包含的所有文件username
(在您的示例中),并打印出拥有这些文件的数字组 ID。这将通过管道传输到sort
,这将按词汇顺序对它们进行排序。将结果通过sort
管道传输到uniq
,这将删除重复的条目。
因此,这将生成一个包含特定目录树中拥有文件的所有唯一组 ID 的列表。
按照写法,这不会完全实现这一点,因为没有分隔符。如果您有由组200
和拥有的文件100
,则输出将如下所示:
100200
...这意味着sort
只会看到一行并且不会执行任何操作。
可以向格式字符串添加换行符来解决这个问题:
find username -printf '%G\n' | ...