#!/usr/bin/env python3
import sys
import os
from operator import itemgetter
import time
dr = sys.argv[1]; n = int(sys.argv[2])
while True:
time.sleep(3)
# list files; get the number of files
files = [os.path.join(dr, f) for f in os.listdir(dr)]; nfiles = len(files)
if nfiles > n:
# if nfiles exceeds the threshold, get the number of files to delete
todel = nfiles - n
# sort the list by creation date, delete the oldest
del_list = sorted([
[f, os.path.getctime(f)] for f in files
], key=itemgetter(1))[:todel]
for f in del_list:
os.remove(f[0])
免责声明:我已经使用包含空格的文件名测试了以下命令,但没有使用包含换行符的文件名。我怀疑它们不会很好地处理包含换行符的文件名,并且如果您怀疑可能会创建包含它们的文件名,则会避免使用它们。
这种方法依赖于文件的 ctime,因此如果文件的任何属性发生更改,它们将看起来比创建时间更新。只有您可以决定依赖 ctime 是否适用于您的情况。如果您更愿意使用 mtime,请在命令中更改
-printf "%C+ %p\n"
为。-printf "%T+ %p\n"
find
可以在包含 tar 文件的目录中发出以下命令。这假设文件名都是类似
something.tar
. 如果文件名不是这种格式,则需要修改命令,如果文件是 .tar.gz 文件,则将其更改为-iname '*.tar.'
,或者如果您只想对该目录中的任何文件进行操作,则-iname '*.tar.gz*'
删除整个字符串,-iname '*.tar.'
无论文件名格式如何。如果这显示了最旧的文件,超出了 15 个文件的限制,则使用以下命令删除这些文件。
解释方式:
find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n"
将列出.
(当前目录)中以 .tar 结尾的所有文件,而不递归到子目录中。然后它打印 ctime timastamp 后跟一个空格和带有尾随换行符的文件名。| sort -n
对 的输出进行数字排序find
,因此文件从最旧到最新(按 ctime)列出。| cut -d ' ' -f 2-
删除find
创建的添加时间戳,但保留 . 列出的文件的顺序sort
。| head -n -15
从cut
.xargs -I{} rm "{}"
在每个文件上运行rm
命令,确保文件名不会在空格上拆分。这可以编写为 bash 脚本,其中包含要保留的文件数和要在其上操作的目录作为脚本中的变量。可以将目录和文件保留计数作为参数传递,但我不会在这里介绍。
如果您将此脚本保存在某处,例如
/home/user/trim_old_gits
并确保您已授予它可执行权限。该脚本可以通过输入以下命令从命令行运行:或从内部
/home/user
:正如Jacob的奇妙python 答案中所提到的,如果立即删除文件并不重要,或者时间更敏感,那么使用该
cron
实用程序将是确保定期发生这种情况的好方法。inotifywait
鉴于两者
ctime
都mtime
不能保证您实际上删除了最旧的文件,具体取决于中间文件发生的情况,下面的脚本会删除给定目录中超过任意数量的文件。(ao)这里我们可以读到:
话说回来
根据
ctime
文件的数量,如果文件数量超过设定的数量,下面的小后台脚本将删除最旧的文件。在您的情况下,这是否是一个可用的选项由您决定。剧本
如何使用
keep_latest.py
使用您的目录路径和要保留为参数的(最新)文件的数量从终端测试运行脚本:
保留最新的 15 个文件
'/path/to/directory'
如果一切正常,添加到启动应用程序:Dash > Startup Applications > Add。添加命令:
其他选项
上面的脚本是众多选项之一。如果其中一个
mtime
或ctime
就足够了,另一种选择是使用inotifywait,并使其与上面的脚本执行相同的操作,但前提是文件被添加、移动或复制到目录中。如果时间准确性(立即删除额外文件)不是很重要,那么运行命令也是
cron
一个不错的选择。如果上面的循环
inotifywait
或脚本更有效,则将成为测试和比较的对象。无论哪种方式,使用的资源几乎都没有。