unix – 如何删除文件夹中除最新三个文件之外的所有文件
我有一个文件夹,其中包含一些颠覆修订签出(运行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命令删除这些文件/文件夹?
好吧,你的脚本有一些问题.
首先,也是最有问题的是这一行: ls -t /var/path/to/folder |head -n 3; ls -t将按照上次修改时间的顺序返回文件列表,从最近修改的开始. head -n 3表示只列出前三行.所以这就是“给我一个只有最近修改过的三个文件的列表”,我认为这不是你想要的. 我不确定你用第二个ls命令做了什么,但我很确定这只是将目录中的所有文件连接到你的列表中.这意味着当它被排序和unq’ed时,你将只留下该目录中所有文件的按字母顺序排列的列表.当这个传递给像xargs rm这样的东西时,你将清除该目录中的所有内容. 接下来,排序| uniq不需要uniq部分.您可以在排序上使用-u开关来删除重复项.无论如何你不需要这个部分. 最后,实际删除了目录.在那一部分,你在问题中说得对:只需使用rm -r 这是我能想到的最简单的方法: ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 这是这里发生的事情: > ls -t1正在打印/ var / path / to / folder中所有文件的列表,每行一个文件/目录,按最近的修改日期排序. 请注意,我没有对任何内容进行排序或删除任何重复项.那是因为: > ls仅报告一次文件,因此不需要删除重复项 所有这些都有意义吗? 编辑: 因为我在传递绝对目录时指定完整路径是错误的,并且因为你可能无法执行cd,所以也许你可以使用tail代替. 例如: ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |