从没有最后三个的子文件夹中删除文件

时间:2016-05-10 06:31:07

标签: bash shell nested-loops

我有这样的结构:

/usr/local/a/1.txt
/usr/local/a/2.txt
/usr/local/a/3.txt
/usr/local/b/4.txt
/usr/local/b/3.txt
/usr/local/c/1.txt
/usr/local/c/7.txt
/usr/local/c/6.txt
/usr/local/c/12.txt
...

我想删除子文件夹中的所有文件* .txt,除了最后修改日期最后的三个文件,但是我在当前目录中

ls -tr *.txt | head -n-3 |xargs rm -f

我需要将其与代码结合起来:

find /usr/local/**/* -type f 

我应该使用maxdepth选项吗?

感谢您的帮助, AOLA

4 个答案:

答案 0 :(得分:1)

添加maxdepth个选项以查找一个级别,按上次修改时间排序文件,tail忽略最早修改过的3个文件,xargs添加-r以删除文件只有在找到后才会显示。

 for folder in $(find /usr/local/ -type d)
 do     
     find $folder -maxdepth 1 -type f -name "*.txt" | xargs -r ls -1tr | tail -n+3 | xargs -r rm -f
 done

在没有rm的情况下运行上述命令一次,以确保先前的命令选择正确的文件进行删除。

答案 1 :(得分:0)

您几乎已经获得了解决方案:使用find获取文件,ls按修改日期排序,tail省略最近修改的三个文件:

find /usr/lib -type f | xargs ls -t | tail -n +4 | xargs rm

如果您只想删除指定深度的文件,请添加-mindepth 4 -maxdepth 4以查找参数。

答案 2 :(得分:0)

您可以使用查找的-printf选项,在文件名前打印修改时间,然后对日期进行排序和删除。这样可以避免使用ls。

find /usr/local -type f -name '*.txt' -printf '%T@|%p\n' | sort -r | cut -d '|' -f 2 | head -n-3 | xargs rm -f

使用xargs ls -t的其他答案可能会导致不正确的结果,因为xargs的结果可能会超过单ls -t个命令。

答案 3 :(得分:0)

但是对于每个子文件夹,所以当我有

/usr/local/a/1.txt
/usr/local/a/2.txt
/usr/local/a/3.txt
/usr/local/a/4.txt
/usr/local/b/4.txt
/usr/local/b/3.txt
/usr/local/c/1.txt
/usr/local/c/7.txt
/usr/local/c/6.txt
/usr/local/c/12.txt

我想分别使用每个子文件夹的代码

head -n-3 |xargs rm -f

所以我敢打赌,如果我按日期排序,那么要删除的文件:

/usr/local/a/4.txt
/usr/local/c/12.txt

我想留下任何子文件夹中的三个最新文件