【发布时间】:2021-01-03 03:20:36
【问题描述】:
我的系统依赖于每个子目录只有一个文件(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 文件通过管道传输到 cd 中,然后在每个文件夹中执行命令二?或者只是一种将命令 2 递归应用于所有子文件夹的方法,而不管该文件夹中包含多少文件?
我想到的最后一件事是,也许我尝试过的命令 3 适用于我有数十万个目录的主目录,难怪参数行可能太长 - 但 -mindepth 2 没有改变一件事。
谢谢
【问题讨论】:
-
我认为您需要重新考虑您的整个方法 - 如果您的任何子目录中的文件少于 3 个,您就会遇到问题。您要尝试执行的操作类似于
find -type d -exec sh -c 'cd "{}";pwd; ls -t | tail -n +2|xargs rm ' \;...但正如我所说...不可靠。