unix – 如何删除文件夹中除最新三个文件之外的所有文件

前端之家收集整理的这篇文章主要介绍了unix – 如何删除文件夹中除最新三个文件之外的所有文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个文件夹,其中包含一些颠覆修订签出(运行capistrano部署配方时会检出这些签出).

我真正想做的是保持最新的3个版本,capistrano脚本检查并删除其他的,所以为此我计划在终端上使用run命令运行一些命令,实际上capistrano没有得到任何东西在这里,但一个unix命令.

我试图运行一个命令来获取除最新三个文件之外的文件列表并删除其余文件,我可以使用以下命令获取文件列表.

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs

现在如果我在这个命令的末尾添加一个rm -Rf,它会返回我找不到删除文件.所以这很明显,因为这只返回文件夹的名称,而不是文件夹的完整路径.

无论如何使用一个unix命令删除这些文件/文件夹?

好吧,你的脚本有一些问题.

首先,也是最有问题的是这一行:

ls -t /var/path/to/folder |head -n 3;

ls -t将按照上次修改时间的顺序返回文件列表,从最近修改的开始. head -n 3表示只列出前三行.所以这就是“给我一个只有最近修改过的三个文件的列表”,我认为这不是你想要的.

我不确定你用第二个ls命令做了什么,但我很确定这只是将目录中的所有文件连接到你的列表中.这意味着当它被排序和unq’ed时,你将只留下该目录中所有文件的按字母顺序排列的列表.当这个传递给像xargs rm这样的东西时,你将清除该目录中的所有内容.

接下来,排序| uniq不需要uniq部分.您可以在排序上使用-u开关来删除重复项.无论如何你不需要这个部分.

最后,实际删除了目录.在那一部分,你在问题中说得对:只需使用rm -r

这是我能想到的最简单的方法

ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r

这是这里发生的事情:

> ls -t1正在打印/ var / path / to / folder中所有文件的列表,每行一个文件/目录,按最近的修改日期排序.
> tail -n 4从第四行开始打印ls -t1输出中的所有行(即不会列出最近修改的三个文件)
> xargs rm -r表示删除尾部的任何文件输出. -r表示递归删除文件,因此如果遇到目录,它将删除该目录中的所有内容,然后删除目录本身.

请注意,我没有对任何内容进行排序或删除任何重复项.那是因为:

> ls仅报告一次文件,因此不需要删除重复项
>您正在删除所有传递的文件,因此它们被删除的顺序无关紧要.

所有这些都有意义吗?

编辑:

因为我在传递绝对目录时指定完整路径是错误的,并且因为你可能无法执行cd,所以也许你可以使用tail代替.

例如:

ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r

猜你在找的Bash相关文章