递归删除所有目录中除一个最新文件外的所有文件

Recursively delete all but the one newest file throughout all directories

我的系统依赖于每个子目录只有一个文件(PDF、DOCX)。 有成千上万的子目录。 由于权限错误,在其中一些中,我得到了多个文件。 在这些情况下,我只想保留一个最近修改的文件。

我能够成功导出包含多个文件的目录列表:

find . -type f -printf '%h\n' | sort | uniq -d >test.txt

所以我最终得到了一个很好的列表,列出了我需要查看的所有目录。不过有点长。

我还能够自动删除除目录中最近修改的文件以外的所有内容:

ls -t | tail -n +2 | xargs -d '\n' rm -f

这会删除所有文件,但最近修改的文件除外。

我 运行 遇到的问题是第二个命令只能在该目录中使用。我还没有想出一种方法可以将它递归地应用于所有目录。

我尝试过:

find /data/test/CONTAINER/SANDBOX -type f -exec sh -c 'ls -t | tail -n +2 | xargs -d '\n' rm -f ' {} \;

但这只是产生了 xargs: argument line too long

我已经尝试调整 xargs 参数,但我确定一定有更好的方法来执行此操作?也许 shell 脚本将 test.txt 文件通过管道传输到文件夹中,然后在每个文件夹中执行命令二?或者只是一种递归地将命令 2 应用于所有子文件夹的方法,而不管该文件夹中包含多少文件?

我最后想到的是,也许我尝试过的命令 3 适用于主目录,我在主目录中有数十万个目录,难怪参数行可能太长 - 但是 -mindepth 2什么都没变。

谢谢

我认为下面的脚本应该可以解决问题。

#!/bin/bash

DIR_TO_FIND="/path/to/dir"

find "$DIR_TO_FIND" -type d | while read -r DIR; do
    cd "$DIR"
    ls -t | tail -n +2 | xargs -d '\n' rm -f
    cd "$DIR_TO_FIND" 
done