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