尽管我已经潜水有一段时间了,但这是我的第一个问题。
问题:我想使用 find 来获取目录中权限未设置为 644(或其他权限值)的文件。有没有更简便的方法来编写此代码,或者唯一的方法是仅使用 -perm 和 -or 选项并列出除 644 之外的每种权限类型?
这是我希望加快速度的更大命令的一部分:
find /path/to/dir/ -type f -print0 | xargs -0 chmod 644
我希望只向 xargs 提供需要更新的文件名可以加快速度。该目录有大约一百万个文件,但通常只有大约 10,000 个需要更新权限。我认为该命令很慢,因为它无论如何仍在传输所有文件。也许对较大的命令有更有效的方法。如果您知道,请告诉我。不过我仍然想知道这个问题的答案。顺便说一句,在将文件添加到目录之前,我无法更新权限。
答案1
!
当条件为假时,运算符返回真。
因此,虽然-perm 0644
匹配设置了 rw-r--r-- 权限的文件,但! -perm 0644
匹配没有这些权限的文件。
您需要的命令是:
find /path/to/dir/ -type f ! -perm 0644 -print0 | xargs -0 chmod 644
答案2
find /path/to/dir ! -perm 0644
和
find /path/to/dir ! -perm 0644 -exec chmod 0644 {} \;
答案3
至少在 GNU find 中,你可以使用 ! 运算符和 -perm 进行否定。例如:
find /path/to/dir ! -perm 644
根据您给出的示例,您是否只是想确保所有者至少具有读/写权限,并且每个人都至少具有读权限?如果是这样,那么您可以使用 chmod 来做到这一点:
chmod -R a+r,u+w /path/to/dir/*
答案4
一个可能的解决方案是,如果您的目录较少,则运行 a chmod -R 644 /path/to/dir
,然后运行 a find /path/to/dir -type d -exec chmod 755 {} \;
。