Linux 按字母顺序排序时删除除N个文件以外的所有文件的Bash脚本

Linux 按字母顺序排序时删除除N个文件以外的所有文件的Bash脚本,linux,bash,ubuntu,Linux,Bash,Ubuntu,在标题中很难解释 我有一个bash脚本,每天运行,将一个文件夹备份到一个zip文件中。zip文件名为worldYYYYMMDD.zip,其中YYYYMMDD为备份日期。我要做的是删除除5个最新备份之外的所有备份。将文件按字母顺序排序将首先列出最旧的文件,因此,在按字母顺序排序时,我基本上需要删除除最后5个文件以外的所有文件。下面一行应该可以做到这一点 ls -F world*.zip | head -n -5 | xargs -r rm ls-F:按字母顺序列出文件 head-n-5:过滤掉

在标题中很难解释


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

下面一行应该可以做到这一点

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

      find /your/directory -name 'world*.zip' -mtime +5 | xargs rm
      
      之前先测试一下。这将删除所有超过5天的
      world*.zip
      文件。所以这是一个不同于你的逻辑

      ls | grep ".*[\.]zip" | sort | tail -n-5 | while read file; do rm $file; done
      
      • 排序
        对文件进行排序
      • tail-n-5
        返回除5个最近的
      • while
        循环执行删除操作

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

          rm `ls -A | head -5`
          

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

          sort-r
          将按相反顺序排序,因此最新的将位于顶部

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


          xargs rm
          将删除这些文件。Xargs用于将stdin作为参数传递给rm。

          er…include
          ls-AF world*.zip
          更好。
          ls-F
          在文件名末尾添加了cruft,因此不应使用<代码>-不需要,因为所有文件都没有隐藏。@larsmans,谢谢,已更新。(我只是假设他想要它,正如他在op中所做的那样。)肯定需要删除
          -F
          。请将最后一位
          xargs-r rm
          ,否则当文件数少于5个时,它将出错。这将删除5个文件。作者只需要5个和grep-c计数的文件。@Benoit是一个打字错误,我已经纠正了。可能是echo world*.zip | sort | tail-n-5 | xargs rm更有效。grep没有必要@Benoit:
          echo
          在一行上输出所有内容,因此排序无效。这是否意味着在您感觉备份过多时手动执行,或者每次运行bash脚本时?@chaz8705我都会使用这两种方法。我知道这些答案中的大多数都会因包含空格的文件名而失败。尽管这很有意义,但我不想根据文件日期进行删除。如果备份脚本失败,我仍然希望保留最新的5个,因此aioobe的答案对我来说是最好的。{}应该是转义的或引号中的。我知道它在这种情况下是有效的,但它仍然是一个很好的实践,并且是手册页推荐的。