首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux下超百万文件目录的遍历或删除

linux下超百万文件目录的遍历或删除

原创
作者头像
pooky
发布于 2021-02-04 09:36:41
发布于 2021-02-04 09:36:41
5.4K00
代码可运行
举报
文章被收录于专栏:开发随笔开发随笔
运行总次数:0
代码可运行

今天在群里有个群友问了个问题,生产环境有目录包含数量较多的文件,删除会被卡住,自己想了下发现自己这点没遇到过但是确实存在这个情况就去了解学习了下,这里做一下小结

生成测试文件

初始测试文件这里生成300w个文件(其实生成也需要一点时间,我测试的时候跑到120w左右的样本就能明显感受差别了)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
dir=/root/data/tmp/files
for((i=1;i<3000000;i++));
do
    file=$dir"/"$i".txt"
    touch $file
    echo $file"......done"
done

遍历文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
function scanDir(){
    for file in `ls -f $1`
    do
        curFile=$1"/"$file
        if [ -d $curFile ]
        then
            scanDir $curFile
        else
            echo $curFile
        fi
    done
}
scanDir $1

其实 一般直接 ls 遍历就可以 但是   ls 遍历会卡住

这是因为默认情况下ls输出的是经过排序过的,为了排序自然要开辟内存进行运算,那么需要消耗很大的空间和计算 那么ls -f 命令能够不执行排序操作,读取了就立即输出, linux具体文件目录组织方式还有ls排序的原理可以回头单开一篇这里就不多深入了 经过测试(肉眼+秒表) 在100w的文件数量的目录里面 ls 遍历需要4秒

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ls -f 不用排序 do not sort, enable -aU, disable -ls --color
ls -1 输出长格式列表(这个在help里面没有)

删除文件

一般我们直接用 rm -rf ./* 就可以但是 当目录文件过多的时候会报错这是因为

linux下面的命令长度和参数数量都是有限制的 操作系统受参数ARG_MAX的限制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@VM-88-103-centos ~/data/tmp/files]# getconf ARG_MAX
2097152

操作系统受参数LINE_MAX的限制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@VM-88-103-centos ~/data/tmp/files]# getconf LINE_MAX
2048

所以删除 rm -rf ./* 如果文件超过数量是会报错的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@VM-88-103-centos ~/data/tmp/files]# rm -rf ./*
-bash: /usr/bin/rm: Argument list too long

所以删除的时候可以用上面的脚本遍历删除

同理的也可以用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find . -name "*" | xargs rm

查看卡住的进程在干嘛

在命令或者进程卡住的情况下 怎么知道进程在干嘛呢 可以用strace命令

首先找到pid然后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
strace -p 3963

unlinkat(4, "227219.txt", 0)            = 0
unlinkat(4, "227249.txt", 0)            = 0
unlinkat(4, "227253.txt", 0)            = 0
unlinkat(4, "227254.txt", 0)            = 0
unlinkat(4, "227255.txt", 0)            = 0
unlinkat(4, "227258.txt", 0)            = 0
unlinkat(4, "227268.txt", 0)            = 0
......

就可以看到这个进程到底在干嘛了

其实首先  卡住这个如果目录过多 肯定会消耗比一般情况下更多的时间的,删除的操作时间是固定的,那么能解决的就是查找文件的操作,

减少不必要的操作,不用一次性全部获取 可以找到一个删除一个。这样能大大减少卡住的时间。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这条命令有可能断送DBA职业生涯,我今天真的执行了
这个是从库,没有读业务和其他下游同步,风险可控。但是大家还是要谨慎。我执行这个命令是因为我搜到的菜鸟教程的split命令案例错误导致我生成了大量小文件。没想到大名鼎鼎的菜鸟教程也会有问题,大家还用man或者tldr查看帮助手册吧。
DBA札记
2024/06/03
1540
这条命令有可能断送DBA职业生涯,我今天真的执行了
008.Linux文件目录管理命令基础
1. pwd:显示当前所在的位置 # 显示当前工作目录的绝对路径 [15:31:44 root@node00 tmp]# pwd /tmp # 如果当前目录是软链接目录,则显示软链接目录的物理路径 [15:35:54 root@node00 a]# pwd -P /tmp/a # 如果当前目录是软链接目录,还是显示逻辑路径(默认) [15:35:58 root@node00 a]# pwd -L /tmp/b/a # 使用PWD环境变量输出当前目录的绝对路径 [15:47:10 root@node00
CoderJed
2020/04/10
9150
008.Linux文件目录管理命令基础
Linux下如何快速删除大量碎小的文件?
XX系统,通过FTP给客户实时传送文件,正常逻辑是客户收到文件后,自动删除FTP服务器上的本地文件,但经常出现文件已经推送了,客户没删除文件的情况。每个文件其实是很小的,可能几K,但是量很大,1天几万个,以至于时间久了,本地积的文件就会很多。我们不说让客户怎么排查问题,单就这个现象,如果积了几百万的小文件,我们能做些什么?你可能会说,删了啊,确实应该删了,但是小文件多了,会产生什么影响?如果直接rm,你认为行么?
bisal
2020/07/08
7.8K0
Linux下如何快速删除大量碎小的文件?
运维千问——为什么磁盘文件删除了但空间没释放?
萧十一入职公司2年有余,便成为了一位很热心的实习生导师,新来的实习生与其说他是幸运的,不如说他是“幸运牌方便面“的,每次总被一个问题搞到深夜,饭也来不及吃,只能以面充鸡。
金鹏
2023/09/21
1K0
命令行工具:文件目录操作
文件和目录操作 改变目录 cd path/to/dir:到指定目录 cd ..:到父目录 cd -:到上次所在目录 cd:到home目录 cd ~/path/to/dir:到home目录下指定文件夹 cd /path/to/dir:到root目录下指定文件夹 文件操作 touch test.txt:新建文件test.txt rm test.txt:删除文件text.txt cp /path/to/original /path/to/copy:复制文件 cp -r /path/to/o
用户2183996
2018/06/21
1K0
RH7.9安装部署GreenPlum 6
1、系统版本:redhat7.9 2、硬件:3台虚拟机,2核,16G内存,50G硬盘 3、实验节点规划一个master, 4个segment,4个mirror,无standby
Lucifer三思而后行
2021/08/17
7990
6 个 Linux 运维典型问题,大牛的分析解决思路在这里
来源:CU技术社区 ID:ChinaUnix2013 作为一名合格的 Linux 运维工程师,一定要有一套清晰、明确的解决故障思路,当问题出现时,才能迅速定位、解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示信息,一般情况下这个提示基本定位了问题的所在,因此一定要重视这个报错信息,如果对这些错误信息视而不见,问题永远得不到解决。 查阅日志文件:有时候报错信息只是给出了问题的表面现象,要想更深入的了解问题,必须查看相应的日志文件,而日志文件又分为系统日志文件(/
小小科
2018/06/20
1.9K0
【Linux】常见指令(一)
前面我们已经学习了关于云服务器搭建的过程,下面,我们来正式开始操作指令。
平凡的人1
2022/11/15
1.9K0
【Linux】常见指令(一)
出了Linux 故障找不到方法?看大牛简单、朴实的解决思路
本文由马哥教育Linux云计算面授班23期学员推荐,转载自互联网,作者为Lis,Linux资深技术专家,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。 与windows系统一样,linux操作系统也会存在很多问题和故障,很多linux新手都害怕故障,面对出现的问题显得无可奈何,更有甚者,由此放弃了linux,其实,我们不应该惧怕问题,学习就是一个发现问题与解决问题的过程,只要掌握了解决问题的基本思路,一切故障都会迎刃而解,当然前提是我们已经具备了解决问题的思路和扎实的知识功底。
小小科
2018/05/02
2.5K0
出了Linux 故障找不到方法?看大牛简单、朴实的解决思路
两个主题:躲避execve与分析/proc/目录
躲避execve,是在原来的文章的基础上补充一个小思路,分析/proc/目录 是为了下一篇讲解内存中修改函数做准备,要让大家提前知道这回事。
七夜安全博客
2020/04/07
1.7K0
两个主题:躲避execve与分析/proc/目录
linux文件目录管理基本命令总结
元数据:metadata   (文件的类型,权限,从属关系,大小,时间,数据区指针)
用户4877748
2020/07/21
1.1K0
Linux文件管理
相对路径:不以斜线开始,制定相对于当前工作目录活某目录的位置,可以作为一个简短的星矢制定一个文件名
鱼丸葱面
2020/12/09
4.1K0
Linux文件管理
Linux 文件目录特殊权限设定(SUID,SGID,SBIT)
Linux文件及目录的权限设定,除了我们孰知的读写执行(rwx)之外,还有一些特殊的权限设定用来满足特定的目录。这些特殊权限的设定主要是SUID,SGID以及SBIT。这几个值并非一个单独的rwx,而是在文件或目录上的x权限上做动作,来达到实现文件或目录特殊权限的目的。本文主要描述这3个特殊权限的用法以及umask。
Leshami
2018/08/13
2.7K0
Linux 文件目录特殊权限设定(SUID,SGID,SBIT)
【Linux】常见指令收官&&拓展
Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多。这里我们只说了-name选项
平凡的人1
2022/11/15
8910
【Linux】常见指令收官&&拓展
Linux 系统被黑客入侵!怎么排查?
近期有一个朋友的服务器(自己做了网站)好像遭遇了入侵,具体现象是:服务器 CPU 资源长期 100%,负载较高。服务器上面的服务不能正常提供服务。
IT运维技术圈
2023/12/26
1K0
Linux 系统被黑客入侵!怎么排查?
【Linux修炼】2.常见指令(中)
rmdir是一个与mkdir相对应的命令。mkdir是建立目录,而rmdir是删除命令。
每天都要进步呀
2023/03/28
5.5K0
【Linux修炼】2.常见指令(中)
Linux系列教程(四)——Linux常用命令之文件和目录处理命令
  这个系列教程的前面我们讲解了如何安装Linux系统,以及学习Linux系统的一些方法。那么从这篇博客开始,我们就正式进入Linux命令的学习。学习命令,首先要跟大家纠正的一点就是,我们不需要记住每
IT可乐
2018/01/04
2.3K0
Linux系列教程(四)——Linux常用命令之文件和目录处理命令
Linux常见的命令操作
用户可利用 alias ,自定义指令的别名。若仅输入 alias ,则可以列出目前说有的别名设置。
利刃大大
2023/04/12
7370
linux之文件目录类相关的指令
ls:显示文件或目录,带上-a表示加上显示隐藏目录或文件,加上-l表示以列表显示。
西西嘛呦
2020/08/26
1.7K0
Linux创建、编辑文件、目录管理、文件解压及删除命令整理总汇
例:$ touch hello.txt 如果 hello.txt 文件不存在,则创建文件,如果存在,则修改 hello.txt 所有的时间为当前系统的时间。
德顺
2019/11/12
4K0
相关推荐
这条命令有可能断送DBA职业生涯,我今天真的执行了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验