我正在尝试做一些看起来很简单但我无法解决的事情。
我有一个目录,其中有一堆子目录,所有子目录都有多个文件(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 --
如果您的实用程序支持某些扩展名,请参阅下面的评论,了解如何将其调整为更有趣的文件名。