在子目录中保留 N 个文件

在子目录中保留 N 个文件

我正在尝试做一些看起来很简单但我无法解决的事情。

我有一个目录,其中有一堆子目录,所有子目录都有多个文件(jpg 文件)。我想执行一个命令,只在这些目录中保留 4 或 N 个文件。文件的顺序并不重要,因为我已经看到了相关问题,具体取决于它们的创建时间

我玩过 ls + head 并尝试使用 -delete 选项将 find 放入循环中,但仍然没有运气。

答案1

也许是这样的:

for dir in /target/dir/*/; do
  (cd -- "$dir" && set -- *.jpg && [ "$#" -gt 4 ] && shift 4 && rm -f -- "$@")
done

使用zsh,您可以缩短为:

for dir (/target/dir/*(/)) rm -f $dir/*.jpg(N[5,-1])

答案2

假设这些是常规文件,路径中没有空格、换行符、引号、反斜杠或无效字符:

find /target/dir/ -type f \
  | awk '{t=$0; gsub(/\/[^/]*$/, "", t); if(a[t]++ < 4) print}' \
  | xargs rm --

如果您的实用程序支持某些扩展名,请参阅下面的评论,了解如何将其调整为更有趣的文件名。

相关内容