【问题标题】:how to delete all files except the latest three in a folder如何删除文件夹中除最新三个文件之外的所有文件
【发布时间】:2010-12-15 06:32:11
【问题描述】:

我有一个文件夹,其中包含一些 subversion 修订检出(这些在运行 capistrano 部署配方时被检出)。

我真正想做的是保留 capistrano 脚本检查的最新 3 个修订并删除其他修订,所以为此我计划使用运行命令在终端上运行一些命令,实际上 capistrano 并没有这里有任何事情要做,但有一个 unix 命令。

我试图运行一个命令来获取除最新三个文件之外的文件列表并删除其余文件,我可以使用以下命令获取文件列表。

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs

现在,如果我在此命令的末尾添加一个 rm -Rf,它会返回我找不到要删除的文件。这很明显,因为它只返回文件夹的名称,而不是文件夹的完整路径。

是否可以使用一个 unix 命令删除这些文件/文件夹?

【问题讨论】:

    标签: unix


    【解决方案1】:

    好的,你的脚本有一些问题。

    首先,也是最成问题的是这一行:

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

    ls -t 将按照文件的最后修改时间顺序返回一个文件列表,从最近修改的开始。 head -n 3 说只列出前三行。所以这就是说“给我一个列表三个最近修改的文件”,我认为这不是你想要的。

    我不太确定你在用第二个ls 命令做什么,但我很确定这只是将目录中的所有文件连接到你的列表中。这意味着当它获得sorted 和uniq'ed 时,您将得到该目录中所有文件的按字母顺序排列的列表。当它被传递给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
    

    【讨论】:

    • 您好,感谢您的回复,但我仍然只获得文件名,我的主要需求之一是从服务器的任何目录运行此代码并删除该 var/path/ 中的文件to/folder 如果我在同一个文件夹中,这很好用 var/path/to/folder
    • @nivanka:这真的很奇怪。您是指定相对路径还是绝对路径?如果要从服务器上的任何目录运行它,则需要指定绝对路径。您可以复制/粘贴您正在使用的 exact 命令吗?
    • 嗨,这就是我所做的 ls -t1 /var/path/to/folder |尾-n +4 | xargs rm -r
    • @nivanka:显然我对传递绝对路径导致全路径输出是错误的。对于那个很抱歉。我想你能够做到这一点的唯一方法是将你当前的路径存储在一个变量中,cd/var/path/to/folder,运行我给你的代码,然后使用 cd 回到你原来的路径变量。这是我能做的最好的了,抱歉。
    • 嘿,谢谢,我不知道我是否可以在那里制作 CD,因为我打算在 capistrano 上运行它。无论如何感谢您的支持
    【解决方案2】:

    下面是完成任务的有用方法.......!!

    适用于 Linux 和 HP-UX:

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

    对于 SunOS:

    rm `(ls -t |head -n 100; ls)|sort|uniq -u`

    【讨论】:

    • Mac OSX 怎么样,我想它是 Unix 变种?
    【解决方案3】:

    您好,我找到了一种方法,我们可以使用 unix &&

    所以命令看起来像这样

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

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多