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

yptwkmov  于 2024-01-07  发布在  Unix
关注(0)|答案(4)|浏览(186)

我有一个文件夹,其中包含一些subversion修订 checkout (这些是在运行capistrano部署配方时 checkout 的)。
我真正想做的是保留capistrano脚本 checkout 的最新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命令?

x6yk4ghg

x6yk4ghg1#

好吧,你的剧本有几个地方不对。
首先,也是最有问题的,是这条线:

ls -t /var/path/to/folder |head -n 3;

字符串
ls -t将返回一个文件列表,以它们最后修改的时间为顺序,从 * 最近修改的 * 开始。head -n 3说只列出前三行。所以这就是说“给予我一个 * 只有 * 最近修改的三个文件的列表”,我不认为这是你想要的。
我不太确定你在用第二个ls命令做什么,但我很确定这只是将目录中的所有文件连接到你的列表中。这意味着当它得到sort ed和uniq 'ed时,你只会得到该目录中所有文件的字母顺序列表。当它传递给类似xargs rm的东西时,你会把那个目录里的所有东西都清除掉
接下来,sort | uniq不需要uniq部分。您可以使用sort上的-u开关来消除重复。无论如何,您不需要此部分。
最后,实际删除目录。
这是我能想到的最简单的方法:

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

snz8szmq

snz8szmq2#

下面是一个有用的方法来做这个任务.!

适用于Linux和HP-UX:

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

对于SunOS:

rm (ls -t| head -n 100; ls)|排序|uniq -u

ddarikpa

ddarikpa3#

嗨,我找到了一种方法来做到这一点,我们可以使用unix &&
命令如下所示

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

字符串

rjzwgtxy

rjzwgtxy4#

如果您有任何特定的模式文件名,这里有一个针对Linux/Unix的行解决方案。
相同的命令可以用来删除所有的文件期待最新:

find /path/to/your/directory -type f -name 'pattern*' -exec ls -t {} + | tail -n +2 | xargs rm --

字符串

相关问题