我的系统仅依赖于每个子目录只有一个文件(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:参数行太长
我试图调整xargs参数,但是我确定必须有更好的方法来执行此操作?也许是一个shell脚本,它通过将cd的文件夹的test.txt文件通过管道传送到cd,然后在每个文件夹中执行第二个命令?还是简单地将命令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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句