我有这样的结构:
/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
答案 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
我想留下任何子文件夹中的三个最新文件