【问题标题】:Bash script to delete all but N files when sorted alphabeticallyBash 脚本在按字母顺序排序时删除除 N 个文件之外的所有文件
【发布时间】:2011-06-16 13:58:24
【问题描述】:

标题很难解释。

我有一个每天运行的 bash 脚本,用于将一个文件夹备份到一个 zip 文件中。压缩文件名为 worldYYYYMMDD.zipYYYYMMDD 是备份日期。我想要做的是删除除 5 个最近的备份之外的所有备份。按字母顺序排序文件将首先列出最旧的文件,所以我基本上需要在按字母顺序排序时删除除最后 5 个文件之外的所有文件。

【问题讨论】:

  • 这是否意味着在您觉得备份过多时手动完成,或者每次运行 bash 脚本时手动完成?
  • @chaz8705 我将同时使用它
  • 请注意,这些答案中的大多数都会因文件名包含空格而失败。

标签: linux bash ubuntu


【解决方案1】:

以下行应该可以解决问题。

ls -F world*.zip | head -n -5 | xargs -r rm
  • ls -F:按字母顺序列出文件
  • head -n -5: 过滤掉除最后 5 行以外的所有行
  • xargs -r rm:删除每个给定的文件。 -r:如果输入为空,请不要运行rm

【讨论】:

  • 呃……包括ls -AF world*.zip会更好。
  • ls -F 将 cruft 添加到文件名的末尾,不应使用。 -A 不是必需的,因为没有隐藏任何文件。
  • @larsmans,谢谢,已更新。 (我只是假设他想要它,因为他在操作中拥有它。)
  • -F 肯定需要删除。
  • 制作最后一位xargs -r rm否则少于5个文件会报错
【解决方案2】:

这个怎么样:

find /your/directory -name 'world*.zip' -mtime +5 | xargs rm

先测试一下。这应该删除所有早于 5 天的 world*.zip 文件。所以和你的逻辑不同。

【讨论】:

  • 尽管这是最有意义的,但我不想根据文件日期删除。如果备份脚本失败我仍然想保留 5 个最新的,所以 aioobe 的答案对我来说是最好的。
  • {} 确实应该转义或用引号引起来。我知道它在这种情况下有效,但它仍然是很好的做法,并且手册页推荐。
【解决方案3】:

我现在无法测试它,因为我没有Linux机器,但我认为应该是:

rm `ls -A | head -5`

【讨论】:

    【解决方案4】:
    ls | grep ".*[\.]zip" | sort | tail -n-5 | while read file; do rm $file; done
    
    • sort 对文件进行排序
    • tail -n-5 返回除 5 个最近的以外的所有内容
    • while 循环执行删除

    【讨论】:

    • 没有。这将删除 5 个文件。作者想要除 5 之外的所有文件,并且 grep -c 计算文件。
    • @Benoit 是我修正的错字。
    • 可能echo world*.zip | sort | tail -n -5 | xargs rm效率更高。
    • grep 是不必要的。 @Benoit:echo 全部输出在一行上,因此排序无效。
    【解决方案5】:

    ls world*.zip | sort -r | tail n+5 | xargs rm

    sort -r 会倒序排列,所以最新的会排在最前面

    tail n+5 将输出行,从第 5 行开始

    xargs rm 将删除文件。 Xargs 用于将标准输入作为参数传递给 rm。

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 2022-09-06
      • 2016-09-25
      • 2015-05-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多