我能否仅通过我通过的名称将find用于可写性测试,而无需重复?

时间:2019-01-14 04:12:42

标签: regex linux shell awk sed

我有以下代码,我只是想在/etc/passwd文件中打印用户主目录的权限。我还试图只获取那些具有组和世界写权限的目录。

我能够获得主目录的详细信息,但是只能打印所有在主目录中递归存在的目录。我只需要打印主目录的值,而不必递归地进行。

for homdir in $(cat /etc/passwd | awk 'BEGIN{FS=":"}{print $6}'); do find $homdir -perm -o+w; done > /tmp/writeperimissions

我希望输出仅将目录的组和世界可写权限打印到/tmp/writeperimissions中(而不是递归地打印)。

1 个答案:

答案 0 :(得分:1)

使用-maxdepth 0仅匹配项目本身。因此:

while IFS=: read _ _ _ _ _ home _; do
  [[ -d $home ]] || continue # skip directories that do not actually exist
  find "$home" -maxdepth 0 -perm -o+w
done </etc/passwd | tee /tmp/world-writable-homedirs

read传递多个参数时,它将拆分为IFS中的字符的字段(在本例中为:),并将每个字段分配给一个由此命名的变量。然后,在这种情况下,我们将前五个字段分配给名为_的变量,并将第六个字段分配给名为home的变量。

不将-r传递给read会告诉它将\:视为文字:,因此您可以让用户在其易于理解的名称或GECOS字段中使用冒号在不放弃分析的情况下;实际上,这使得基于read的解析比awk更为准确。