shell脚本删除除了不同文件夹中最后更新的文件之外的所有文件

时间:2017-08-09 08:16:11

标签: linux bash shell unix sh

我的应用程序日志将在linux系统的以下文件夹中创建。

Folder 1: 100001_1001
folder 2 : 200001_1002
folder 3 :300061_1003
folder 4: 300001_1004
folder 5 :400011_1008

要删除除上述文件夹中的最新文件以外的所有文件,并希望将其添加到cron作业中。

我尝试下面一个不工作需要帮助

30 1 * * * ls -lt /abc/cde/etc/100* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \;
30 1 * * * ls -lt /abc/cde/etc/200* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \;
30 1 * * * ls -lt /abc/cde/etc/300* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \;
30 1 * * * ls -lt /abc/cde/etc/400* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \;

3 个答案:

答案 0 :(得分:0)

你可以使用这个包含所有gnu实用程序的管道(这样我们也可以处理带有特殊字符,空格和glob字符的文件路径)

find /parent/log/dir -type f -name '*.zip' -printf '%T@\t%p\0' |
sort -zk1,1rn |
cut -zf2 |
tail -z -n +2 |
xargs -0 rm -f

答案 1 :(得分:0)

使用稍微修改过的方法:

find /abc/cde/etc/100* -printf "%A+\t%p\n" | sort -k1,1r| awk 'NR!=1{print $2}' | xargs -i rm "{}" 

查找版本不会缺少路径,所以这可能工作(我对目录结构一无所知,以及100 *指向目录,文件还是一组文件......

答案 2 :(得分:0)

您应该使用find。它有一个-delete操作,可以删除符合您规范的文件。 警告-delete很容易出错。首先测试你的命令。例如,要在*.zip下找到名为a/b/c的所有文件(仅限文件):

find a/b/c -depth -name '*.zip' -type f -print

这是测试,它将打印最终命令将删除的所有文件(不要忘记-depth,这很重要)。一旦你确定,执行删除的命令是:

find a/b/c -depth -name '*.zip' -type f -delete

find还有按上次修改日期选择文件的选项,按大小...例如,您可以查找至少24小时前修改过的所有文件:

find a/b/c -depth -type f -mtime +0 -print

并仔细检查后删除它们:

find a/b/c -depth -type f -mtime +0 -delete