如何查找所有目录中包含超过 x 个文件且大于指定大小的文件?

如何查找所有目录中包含超过 x 个文件且大于指定大小的文件?

如何查找目录中包含超过指定数量且大于指定大小的文件的所有文件夹?

一个示例性用例是查找包含分割电影文件的文件夹,这些文件可以是合并像这样(ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4)。

答案1

zsh

x=42 size=M+1
print -rC1 -- **/*(NFe['()(($#)) $REPLY/*(N.L${size}Y${x}[$x]oN)'])

将打印至少包含 42 个大小严格大于 1MiB 的文件的目录。

  • **/*: 递归通配符
  • (...): 全局限定符
  • N: Nullglob: 如果没有匹配,不要抱怨
  • F:限制文件类型目录全部F(至少有一个条目)。
  • e['code']:过滤器评估e返回codetrue 的文件。
  • ()(($#)) args:匿名函数,如果其参数数量非零,则返回 true
  • $REPLY:当前正在考虑的文件(此处为目录)code
  • $REPLY/*: 里面的文件。替换为$REPLY/**/*也可以对子目录中的文件进行计数。
  • .: 限制为常规的文件(不包括目录、符号链接、fifo、设备...)。
  • LM+1:限制大小向上舍入到下一个整数兆字节的文件严格大于 1(大小为 1048577 字节及以上的文件)。
  • Y$x: 别再照顾了X已发现这是一种优化。
  • [$x]:选择X该列表中的第 th(再次作为一种优化,因此code只需要检查它是否传递了至少一个参数)。
  • oN: 不必费心对该列表进行排序。

D如果您还想考虑隐藏的目录/文件,则可以将限定符添加到其中一个或两个 glob。

但如果之后要对这些文件执行某些操作,您可能需要执行以下操作:

for dir in **/*(NF); do
  large_files=($dir/*(N.LM+1))
  (( $#large_files >= 42 )) && do-something-with $large_files
done

答案2

谢谢@穆鲁该命令仅稍作修改,为:

find . -type d -exec sh -c '[ $(find "$1" -type f -size +1M | wc -l) -gt 1 ]' _ {} \; -print

该示例查找当前目录中包含 2 个或更多大于 1 MB 的文件的所有文件夹(您可以替换完整路径的点)。

相关内容