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

我有一个文件夹,其中包含一些颠覆版本签出(当运行capistrano部署配方时签出)。

我真正想要做的是保持最新的3个版本的capistrano脚本检出和删除其他的,所以为此我打算运行一些命令在terminal使用运行命令,实际上capistrano没有任何在这里做,而是一个unix命令。

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

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

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

反正有删除这些文件/文件夹使用一个Unix命令?

好的,你的脚本有一些问题。

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

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

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

我不确定你在做什么第二个ls命令,但我很确定这只是将目录中的所有文件连接到你的列表。 这意味着当它被sortuniq ,你只剩下一个按字母顺序排列的目录中的所有文件的列表。 当这个被传递给像xargs rm这样的东西时,你将会清除该目录中的所有东西

接下来, sort | uniq sort | uniq不需要uniq部分。 您可以使用sort上的-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表示从tail删除任何文件输出。 -r表示递归删除文件,所以如果它遇到一个目录,它将删除该目录中的所有内容,然后删除目录本身。

请注意,我不排序任何东西或删除任何重复。 那是因为:

  • ls只报告一次文件,所以没有重复删除
  • 您正在删除所有传入的文件,因此删除的顺序无关紧要。

这一切都有道理吗?

编辑:

由于我错误的ls指定完整的路径,当传递一个绝对目录时,因为你可能无法执行一个cd ,也许你可以使用tail

例如:

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

下面是做这个任务的一个有用的方法……. !!

对于Linux和HP-UX:

ls -t1 | 尾巴-n +50 | xargs rm -r#留下最新的50个文件/目录。

对于SunOS:

rm(ls -t | head -n 100; ls)| sort | uniq -u`

您好我找到了一种方法来做到这一点,我们可以使用unix &&

所以命令将如下所示

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