2010-12-15 58 views
8

我有一个文件夹,其中包含一些subversion版本检出(在运行capistrano部署配方时检出)。如何删除文件夹中除最新三个文件以外的所有文件

我真正想要做的是保持最新的3个版本,其中capistrano脚本签出并删除其他的,所以为此我打算运行命令在终端上运行一些命令,实际上capistrano hasn'这里没有任何事情要做,而是一个unix命令。

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

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

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

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

回答

13

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

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

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

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

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

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

最后,实际删除该目录。在这一部分,你说得对你的问题:只要使用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 
+0

你好感谢你的反应,但我仍然得到的文件只有名字,我的主要需求之一是从服务器的任何目录运行此代码,并删除该文件在该var /路径/到/文件夹这很好,如果我在同一文件夹var/path/to /文件夹 – nivanka 2010-12-15 08:06:27

+0

@nivanka:这真的很奇怪。你是指定一个相对或绝对路径?如果要从服务器上的任何目录运行此命令,则需要指定绝对路径。你能复制/粘贴你正在使用的* exact *命令吗? – AgentConundrum 2010-12-15 08:12:54

+0

嗨,这是我做ls -t1/var/path/to/folder | tail -n +4 | xargs rm -r – nivanka 2010-12-15 08:55:29

0

您好我发现了一个办法做到这一点,我们可以使用UNIX & &

这样的命令看起来像这样

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

下面是一个有用的方式做任务....... !!

Linux和HP-UX:

LS-T1 | tail -n +50 | xargs rm -r#保留最新的50个文件/目录。

在SunOS:

RM`(LS -t |头-n 100,LS)|排序| uniq的-u`

相关问题