文章目录
- 场景
- 解决方案
- 苦苦追寻
- 统计行数
- 方案一 直接统计
- 方案二 先把文件名输出到文件,然后在统计那个文件
- 追加写入(推荐)
- 覆盖写入
场景
服务器迁移,一个文件夹下有很多的文件。ls命令或者wc -l命令都无法统计出来。
先来个最基本的ls命令:
ls
结果没反应
是因为ls行数太多了吧,那么少几行:
ls | head -n 10
还是没反应
算了,直接统计个行数看看:
ls | wc -l
或者文件夹外 wc -l data
还是没反应。
du -sh data
结果约34G,有点大呀。
解决方案
苦苦追寻
四处搜寻,找到个命令。
ls -1 -f | head -n 1000
试了下,果然出结果。
受教了,这命令啥意思啊,居然能出结果。
先猜测一波:
-1 是显示一行? (联想到tail -1了)
-f 是动态滚动显示? (联想到tail命令的-f了)
结果啪啪打脸。
关键就在这个-U上。
为什么ls命令出不来结果? 因为ls命令默认会排序,那么如果文件很多,它要先全部读取到,排序后才会显示。
实测下,如果用-U可以出结果,那么说明上述结论成立:
ls -1 -f | head -n 1000
网上的命令。
ls -U | head -n 1000
不用-f,用-U试下,同样可以很快出结果。
找到了根源,那么就好处理了。
统计行数
方案一 直接统计
ls -U | wc -l
,实测速度可以,1分钟以内出结果,661783条。
优点,如果条数不是超多,且只要条数不要文件名列表,该命令很简单。
方案二 先把文件名输出到文件,然后在统计那个文件
拿到文件名列表,那后面的就简单了。无论是统计行数,还是进行迁移操作都能实现了。
拿文件列表有2种方案,分别试下。
追加写入(推荐)
时间比较短,结果:
16763778 字节
661687 行
覆盖写入
时间相当长,最后的结果:
16765257字节
661744行
经过对比,2种方式结果一致 。但追加写入的方式速度快很多,推荐。