我有一个包含一些颠覆修订签出的文件夹(这些在运行capistrano部署配方时会被检出)。
我真正想做的是保留最新的3个版本,其中capistrano脚本检查并删除其他的,所以为此我打算使用run命令在终端上运行一些命令,实际上capistrano没有这里有什么可做的,但是unix命令。
我试图运行一个命令来获取除最新三个文件之外的文件列表并删除其余文件,我可以使用以下命令获取文件列表。
(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs
现在如果我在这个命令的末尾添加一个rm -Rf,它会返回我找不到删除的文件。所以这很明显,因为这只返回文件夹的名称,而不是文件夹的完整路径。
无论如何是否使用一个unix命令删除这些文件/文件夹?
答案 0 :(得分:15)
好吧,你的剧本有一些问题。
首先,最有问题的是这一行:
ls -t /var/path/to/folder |head -n 3;
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
以下是这里发生的事情:
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
答案 1 :(得分:3)
以下是执行任务的有用方法....... !!
适用于Linux和HP-UX的:
ls -t1 |尾巴-n +50 | xargs rm -r#留下最新的50个文件/目录。
对于SunOS:
rm`(ls -t | head -n 100; ls)| sort | uniq -u`
答案 2 :(得分:0)
您好我找到了一种方法,我们可以使用unix&&
所以命令看起来像这样
cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r