我收到一个提示,要求我删除目录中所有者 (u) 无法r
、w
、 、x
、 在一个命令中删除的所有文件。
我尝试了这个命令:
find data -type f ! -perm -u=rwx -exec rm -f {} \;
...但我认为它删除了太多文件。
答案1
我思考你想要这个,假设你find
专门使用 GNU:
find -type f \! -perm /u=rwx -exec echo rm -f {} \;
请注意,我添加了一个echo
用于测试。
如果打印的文件符合您的期望,请将其取出。 :)
答案2
如果您使用的是 Linux 系统,则可能有 GNU find
,并且可以按照其他答案中的示例操作,使用find data -type f ! -perm /u=rwx -delete
.
如果您使用的不是 Linux 系统,则很可能使用的是 BSD 系统(例如 macOS 或开源 BSD 之一),该系统不理解谓词参数的find
非标准语法。在这种情况下,您可以在每个文件上使用来挑选出符号用户权限并根据字符串测试它们(这意味着用户对该文件没有任何权限):/u
-perm
stat
---
find data -type f -exec sh -c '[ "$(stat -f %SHp "$1")" = --- ]' sh {} \; -print
这里假设的是 BSD stat
,而不是 Linux stat
。该-f %SHp
选项会将输出格式化为给定文件的stat
“高”(H
用户位)符号(S
)权限位( )。p
与常见 Linux 等效的stat
是使用shell 模式-c %f
,然后将其与?0??
shell 模式进行匹配。
您可以更改-print
为-delete
实际删除文件。
一个稍微高效的变体,不会为每个文件启动一个新的 shell:
find data -type f -exec sh -c '
for pathname do
[ "$(stat -f %SHp "$pathname")" = --- ] && echo rm "$pathname"
done' sh {} +
删除echo
以删除文件。
答案3
免责声明:我是该书的当前作者生皮(右旋) (看https://github.com/raforg/rawhide)
和生皮(右旋) 你可以做:
rh -UUU data 'f && !ur && !uw && !ux'
-UUU
取消链接/删除/移除匹配项。
data
是一个搜索路径。
剩下的就是搜索条件:
f
意味着它是一个普通文件。
!ur
表示所有者可读权限位未设置。
!uw
表示所有者可写权限位未设置。
!ux
意味着所有者可执行权限位未设置。
最后三个可以更简洁地完成none(0700)
:
rh -UUU data 'f && none(0700)'
当然,只有当用户对包含匹配文件的目录具有写权限时,它才能够删除匹配项。如果这是一个问题,您可能需要合并 sudo:
rh -x 'sudo rm %s' data 'f && !ur && !uw && !ux'
-x ...
在每次匹配时执行给定的 shell 命令。
%s
被替换为匹配的文件路径(如 find 的{}
)。
但请注意,如果存在访问控制列表,则此方法不起作用。
如果存在 ACL 并且所有正在检查的文件的所有者是当前用户,那么您可以使用access(2)
系统调用来正确检查访问权限。
GNU find
有-readable
、-writable
、 和-executable
执行实际访问检查,并且rh
有ir
、iw
、 和ix
为此。
rh -UUU data 'f && !ir && !iw && !ix'
但只有当当前用户是所有相关文件的所有者时,这才有用。如果文件可以具有 ACL 和不同的所有者,则该access(2)
方法将无济于事。所以希望你不会遇到这种情况。
答案4
和zsh
:
rm -- data/**/*(D.^rwx)