AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 886790
Accepted
Harsha
Harsha
Asked: 2017-02-24 23:54:17 +0800 CST2017-02-24 23:54:17 +0800 CST 2017-02-24 23:54:17 +0800 CST

如果数量超过 15,删除目录中旧文件(tar)的脚本?

  • 772

请任何人都可以为此提供解决方案我正在尝试将gitlab备份到另一台服务器,如果目录中的文件数超过15,脚本应该删除旧文件吗?

command-line
  • 2 2 个回答
  • 1400 Views

2 个回答

  • Voted
  1. Best Answer
    Arronical
    2017-02-25T04:07:07+08:002017-02-25T04:07:07+08:00

    免责声明:我已经使用包含空格的文件名测试了以下命令,但没有使用包含换行符的文件名。我怀疑它们不会很好地处理包含换行符的文件名,并且如果您怀疑可能会创建包含它们的文件名,则会避免使用它们。

    这种方法依赖于文件的 ctime,因此如果文件的任何属性发生更改,它们将看起来比创建时间更新。只有您可以决定依赖 ctime 是否适用于您的情况。如果您更愿意使用 mtime,请在命令中更改-printf "%C+ %p\n"为。-printf "%T+ %p\n"find

    可以在包含 tar 文件的目录中发出以下命令。这假设文件名都是类似something.tar. 如果文件名不是这种格式,则需要修改命令,如果文件是 .tar.gz 文件,则将其更改为-iname '*.tar.',或者如果您只想对该目录中的任何文件进行操作,则-iname '*.tar.gz*'删除整个字符串,-iname '*.tar.'无论文件名格式如何。

    find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} echo "{}"
    

    如果这显示了最旧的文件,超出了 15 个文件的限制,则使用以下命令删除这些文件。

    find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} rm "{}"
    

    解释方式:

    • 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 脚本,其中包含要保留的文件数和要在其上操作的目录作为脚本中的变量。可以将目录和文件保留计数作为参数传递,但我不会在这里介绍。

    #!/bin/bash
    
    file_limit=15
    dir=/directory/containing/tarfiles
    
    find "$dir" -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -"$file_limit" | xargs -I{} rm "{}"
    

    如果您将此脚本保存在某处,例如/home/user/trim_old_gits并确保您已授予它可执行权限。该脚本可以通过输入以下命令从命令行运行:

    /home/user/trim_old_gits
    

    或从内部/home/user:

    ./trim_old_gits
    

    正如Jacob的奇妙python 答案中所提到的,如果立即删除文件并不重要,或者时间更敏感,那么使用该cron实用程序将是确保定期发生这种情况的好方法。inotifywait

    • 2
  2. Jacob Vlijm
    2017-02-25T02:20:45+08:002017-02-25T02:20:45+08:00

    鉴于两者ctime都mtime不能保证您实际上删除了最旧的文件,具体取决于中间文件发生的情况,下面的脚本会删除给定目录中超过任意数量的文件。

    (ao)这里我们可以读到:

    ctime是 inode 或文件更改时间。ctime 会在文件属性发生更改时更新,例如更改所有者、更改权限或将文件移动到其他文件系统,但也会在您修改文件时更新。时间

    mtime是文件修改时间。当您修改文件时,mtime 会更新。每当您更新文件内容或保存文件时,mtime 都会更新。

    大多数时候 ctime 和 mtime 是相同的,除非只更新文件属性。在这种情况下,只有 ctime 得到更新。

    话说回来

    根据ctime文件的数量,如果文件数量超过设定的数量,下面的小后台脚本将删除最旧的文件。在您的情况下,这是否是一个可用的选项由您决定。

    剧本

    #!/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])
    

    如何使用

    1. 将脚本复制到一个空文件中,另存为keep_latest.py
    2. 使用您的目录路径和要保留为参数的(最新)文件的数量从终端测试运行脚本:

      python3 '/path/to/keep_latest.py' '/path/to/directory' 15
      

      保留最新的 15 个文件'/path/to/directory'

    3. 如果一切正常,添加到启​​动应用程序:Dash > Startup Applications > Add。添加命令:

      python3 '/path/to/keep_latest.py' '/path/to/directory' 15
      

    其他选项

    上面的脚本是众多选项之一。如果其中一个mtime或ctime就足够了,另一种选择是使用inotifywait,并使其与上面的脚本执行相同的操作,但前提是文件被添加、移动或复制到目录中。

    如果时间准确性(立即删除额外文件)不是很重要,那么运行命令也是cron一个不错的选择。

    如果上面的循环inotifywait或脚本更有效,则将成为测试和比较的对象。

    无论哪种方式,使用的资源几乎都没有。

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve