我有一个文件夹,其中包含一些颠覆版本签出(当运行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
命令,但我很确定这只是将目录中的所有文件连接到你的列表。 这意味着当它被sort
和uniq
,你只剩下一个按字母顺序排列的目录中的所有文件的列表。 当这个被传递给像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