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

Unix 如何删除文件夹中除最近三个文件以外的所有文件,unix,Unix,我有一个文件夹,其中包含一些subversion修订签出(这些是在运行capistrano部署配方时签出的) 我真正想做的是保留capistrano脚本签出的最新3个修订版,并删除其他修订版,因此我计划使用run命令在终端上运行一些命令,实际上capistrano在这里没有任何事情要做,只有unix命令 我试图运行一个命令来获取除最后三个文件外的文件列表,并删除其余文件,我可以使用以下命令获取文件列表 (ls -t /var/path/to/folder |head -n 3; ls /var/

我有一个文件夹,其中包含一些subversion修订签出(这些是在运行capistrano部署配方时签出的)

我真正想做的是保留capistrano脚本签出的最新3个修订版,并删除其他修订版,因此我计划使用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-n3
表示只列出前三行。这句话的意思是“给我一个只包含三个最近修改过的文件的列表”,我认为这不是你想要的

我不确定您使用第二个
ls
命令做了什么,但我非常确定这将把目录中的所有文件连接到您的列表中。这意味着当它得到
sort
ed和
uniq
'ed时,您将只剩下该目录中所有文件的字母列表。当它被传递到类似于
xargsrm
的东西时,您将清除该目录中的所有内容

接下来,
sort | 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
    输出中从第四行开始的所有行(即,不会列出最近修改的三个文件)
  • xargsrm-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

嗨,我找到了一种方法我们可以使用unix&&

因此,命令将如下所示

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

下面是完成任务的有用方法

适用于Linux和HP-UX:

ls-t1 | tail-n+50 | xargs rm-r |保留最新的50个文件/目录

对于SunOS:


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

您好,谢谢您的回复,但我仍然只得到文件名,我的主要需求之一是从服务器的任何目录运行此代码,并删除该var/path/to/文件夹中的文件。如果我在同一个文件夹var/path/to中,这项工作正常/folder@nivanka:真奇怪。您指定的是相对路径还是绝对路径?如果要从服务器上的任何目录运行此操作,则需要指定绝对路径。你能复制/粘贴你正在使用的确切命令吗?嗨,这是我做的ls-t1/var/path/to/folder | tail-n+4 | xargs rm-r@nivanka:显然,我错误地传递了绝对路径,导致了完整路径输出。很抱歉。我想你能做到这一点的唯一方法是将你的当前路径存储在一个变量中,
cd
to
/var/path/to/folder
,运行我给你的代码,然后使用变量
cd
返回你的原始路径。这是我能做的最好的了,抱歉。嘿,谢谢你,我不知道我是否能在那里做一张CD,因为我计划在capistrano上运行这个。不管怎样,谢谢你的支持Mac OSX怎么样,我想它是Unix的变种?