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

niv*_*nka 9 unix

我有一个文件夹,其中包含一些颠覆修订签出(运行capistrano部署配方时会检出这些签出).

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

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

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs
Run Code Online (Sandbox Code Playgroud)

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

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

Age*_*rum 16

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

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

ls -t /var/path/to/folder |head -n 3;
Run Code Online (Sandbox Code Playgroud)

ls -t将返回文件列表中的他们的最后修改时间顺序,先从最近修改.head -n 3说只列出前三行.所以这就是"给我一个只有最近修改过的三个文件的列表",我认为这不是你想要的.

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

接下来,sort | uniq不需要该uniq部分.你可以使用-u开关sort来摆脱重复.无论如何你不需要这个部分.

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

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

ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r
Run Code Online (Sandbox Code Playgroud)

这是这里发生的事情:

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

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

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

所有这些都有意义吗?

编辑:

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

例如:

 ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r
Run Code Online (Sandbox Code Playgroud)