删除目录中所有早于最近添加的十个文件的文件

删除目录中所有早于最近添加的十个文件的文件

我有一个压缩的 (tar) 备份文件,它会定期添加到目录中。添加的文件具有如下命名约定:

JenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz

生成的文件名称如下:

jenkinsBackup_20170630-091543.tar.gz

我的目标是选择目录中所有比最近添加到目录中的十个文件更早的文件,然后删除这些文件。本质上是从命令行清理目录。

有人能帮我完成此操作所需的终端命令吗?我不确定如何选择并删除目录中最近十个文件之前的所有文件。

提前感谢你的帮助!

答案1

一种适用于您的文件名的简单方法是使用:

ls -t1 | tail -n +11 | xargs gvfs-rm
  • ls -t1根据文件的修改时间给出文件列表,最新的文件排在第一位。
  • 使用tail -n +11我们跳过前 10 行并获取其余所有内容
  • 然后我们将列表传送至管道xargs gvfs-rm进行删除。

请注意,gvfs-rm将文件移至垃圾箱,用于rm永久删除它们。

如果您想使用文件名而不是其修改时间,请使用ls -1r | tail -n +11 | xargs gvfs-rm

find根据文件名决定的类似解决方案:

find -type f | sort -r | tail -n +11 | xargs gvfs-rm

或者

find -type f | sort | head -n -10 | xargs gvfs-rm

答案2

Python

我假设目录包含仅有的您的备份。如果其中包含其他文件,则会删除错误的文件。

import os
for f in sorted(os.listdir('.'))[:-10]:
    os.remove(f)

解释

  • os.listdir('.')获取当前目录中的文件名
  • sorted()按升序对文件名进行排序(最旧的在前)
  • [:-10]选择除最后十项之外的整个列表
  • os.remove()删除每个文件

答案3

如果你有权限,那么这比使用、或zsh来跳过障碍要容易得多。例如,给定lsfindstat

 % ls -1 JenkinsBackup_*
JenkinsBackup_20170630-095544.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095549.tar.gz
JenkinsBackup_20170630-095550.tar.gz
JenkinsBackup_20170630-095551.tar.gz
JenkinsBackup_20170630-095552.tar.gz
JenkinsBackup_20170630-095553.tar.gz
JenkinsBackup_20170630-095554.tar.gz
JenkinsBackup_20170630-095555.tar.gz
JenkinsBackup_20170630-095556.tar.gz
JenkinsBackup_20170630-095557.tar.gz
JenkinsBackup_20170630-095558.tar.gz

按修改时间列出,最新修改优先,使用om(o订购修改时间)全局限定符:

 % printf '%s\n' JenkinsBackup_*(om)
JenkinsBackup_20170630-095558.tar.gz
JenkinsBackup_20170630-095557.tar.gz
JenkinsBackup_20170630-095556.tar.gz
JenkinsBackup_20170630-095555.tar.gz
JenkinsBackup_20170630-095554.tar.gz
JenkinsBackup_20170630-095553.tar.gz
JenkinsBackup_20170630-095552.tar.gz
JenkinsBackup_20170630-095551.tar.gz
JenkinsBackup_20170630-095550.tar.gz
JenkinsBackup_20170630-095549.tar.gz
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095544.tar.gz

按修改时间列出,最新的在最前面,并从第 11 个开始选择:

 % printf '%s\n' JenkinsBackup_*(om[11,-1])
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095544.tar.gz

删除比最新第 10 个文件更旧的匹配文件:

 % rm -v JenkinsBackup_*(om[11,-1])
removed 'JenkinsBackup_20170630-095548.tar.gz'
removed 'JenkinsBackup_20170630-095547.tar.gz'
removed 'JenkinsBackup_20170630-095546.tar.gz'
removed 'JenkinsBackup_20170630-095545.tar.gz'
removed 'JenkinsBackup_20170630-095544.tar.gz'

zsh:14 扩展:文件名生成

相关内容