删除整个子目录中的通配符,Mac OS

删除整个子目录中的通配符,Mac OS

我想删除运行命令的目录下所有子目录中的通配符。

答案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/文档 ( )。infofindzshinfo zsh qualifiers

1 但是,它会删除符号链接,无论它们是否指向目录类型的文件

相关内容