我想删除运行命令的目录下所有子目录中的通配符。
答案1
find . -name '*.unwanted' ! -type d -delete
将删除名称匹配的文件*.unwanted
(类型为目录1) 在当前目录和下面的子目录中。如果删除! -type d
,它也会删除目录文件,但前提是它们不为空。
请注意,它还会删除隐藏文件和隐藏目录中的文件。
-delete
是一个 BSD 扩展(因此可以在 macOS 中工作),也可以在包括 GNU 在内的其他一些find
实现中找到find
,但不是标准的(-exec rm -f {} +
如果您find
不支持,请替换为)。
由于 macOS 中的默认交互式 shell 现在是zsh
,在 shell 提示符下,您还应该能够执行相同的操作:
rm -f -- **/*.unwanted(D^/) # same as find above, D for dot (hidden) files
rm -f -- **/*.unwanted(^/) # skip hidden files and dirs
rm -f -- **/*.unwanted(-^/) # consider the type of file after symlink resolution
rm -f -- ***/*.unwanted(^/) # follow symlinks when traversing the
# directory tree (same as find -L)
然而,您可能会遇到参数列表太长如果存在大量文件,则会出现错误,这可以通过使用zargs
或使用rm
内置命令来解决zmodload zsh/files
。
find
谓词和 zsh glob 限定符( 中的部分)都(...)
可以进一步细化您要删除的文件。一些例子:
-type f
/(.)
:仅常规文件(代替! -type d
/(^/)
)-mtime -7
/(m-7)
: 不超过 7 天-size +1000000c
/(L+1000000)
:大于 1MB。-exec cmd {} \;
/(e['cmd $REPLY'])
,返回 true 的文件cmd
。- 等详细信息请参阅/的
man
/文档 ( )。info
find
zsh
info zsh qualifiers
1 但是,它会删除符号链接,无论它们是否指向目录类型的文件