删除bash脚本中除最新3之外的所有文件

 手机用户2602923721 发布于 2022-12-12 20:35

问题:除了最新的3之外,如何删除目录中的所有文件?

查找最新的3个文件很简单:

ls -t | head -3

但我需要找到除最新的3个文件以外的所有文件.我该怎么做,如何在同一行中删除这些文件而不为其做一个不必要的for循环?

我正在使用Debian Wheezy和bash脚本.

4 个回答
  • ls -t | tail -n +4 | xargs -I {} rm {}
    

    如果你想要1个衬垫

    2022-12-12 20:39 回答
  • 这将列出除最新三个以外的所有文件:

    ls -t | tail -n +4
    

    这将删除这些文件:

    ls -t | tail -n +4 | xargs rm --
    

    这也将列出dotfiles:

    ls -At | tail -n +4
    

    并使用dotfiles删除:

    ls -At | tail -n +4 | xargs rm --
    

    但要注意:ls当文件名包含有趣的字符(如换行符或空格)时,解析可能会很危险.如果您确定您的文件名不包含有趣的字符,那么解析ls是非常安全的,如果它只是一次性脚本则更是如此.

    如果您正在开发一个重复使用的脚本,那么您肯定不会解析输出ls并使用此处描述的方法:http: //mywiki.wooledge.org/ParsingLs

    2022-12-12 20:39 回答
  • “ ls”(奇怪的命名文件)没有问题的解决方案

    这是ceving和anubhava答案的结合。两种解决方案都不适合我。因为我一直在寻找一个每天都要运行的脚本来备份存档中的文件,所以我想避免出现问题ls(有人可以在备份文件夹中保存一些有趣的命名文件)。因此,我修改了上述解决方案以适应我的需求。Ceving的解决方案删除了​​三个最新文件,而不是我需要的文件和被询问的文件。

    我的解决方案将删除所有文件,最新的三个文件除外

    find . -type f -printf '%T@\t%p\n' |
    sort -t $'\t' -g | 
    head -n -3 | 
    cut -d $'\t' -f 2- |
    xargs rm
    

    一些解释:

    find列出当前文件夹中的所有文件(不是目录)。它们带有时间戳打印。
    sort根据时间戳对行进行排序(最旧的排在最前面)。
    head打印出前行,直到最后3行。
    cut删除时间戳。为每个选定的文件
    xargs运行rm

    供您验证我的解决方案:

    (
    touch -d "6 days ago" test_6_days_old
    touch -d "7 days ago" test_7_days_old
    touch -d "8 days ago" test_8_days_old
    touch -d "9 days ago" test_9_days_old
    touch -d "10 days ago" test_10_days_old
    )
    

    这将创建5个文件,在当前文件夹不同的时间戳。首先运行此脚本,然后删除旧文件的代码。

    2022-12-12 20:41 回答
  • 以下看起来有点复杂,但即使有异常或故意恶意的文件名,也要非常谨慎.不幸的是,它需要GNU工具:

    count=0
    while IFS= read -r -d ' ' && IFS= read -r -d '' filename; do
      (( ++count > 3 )) && printf '%s\0' "$filename"
    done < <(find . -maxdepth 1 -type f -printf '%T@ %P\0' | sort -g -z) \
         | xargs -0 rm -f --
    

    解释这是如何工作的:

    查找<mtime> <filename><NUL>当前目录中每个文件的发出.

    sort -g -z 基于第一列(时间)进行一般(浮点,而不是整数)数字排序,其中行由NUL分隔.

    第一readwhile环带断修改时间(不再需要后sort完成).

    第二readwhile循环读取的文件名(运行,直到NUL).

    循环递增,然后检查计数器; 如果计数器的状态表明我们已经过了最初的跳过,那么我们打印文件名,由NUL分隔.

    xargs -0然后将该文件名附加到它正在收集以调用的argv列表中rm.

    2022-12-12 20:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有