文章目录

  • ​​场景​​
  • ​​解决方案​​
  • ​​苦苦追寻​​
  • ​​统计行数​​
  • ​​方案一 直接统计​​
  • ​​方案二 先把文件名输出到文件,然后在统计那个文件​​
  • ​​追加写入(推荐)​​
  • ​​覆盖写入​​

场景

服务器迁移,一个文件夹下有很多的文件。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了)
结果啪啪打脸。

-1  single-column      只显示单列,也就是文件名

-f do not sort, enable -aU, disable -ls --color
不排序,使用-aU,不使用颜色。
很明显,-f是个组合命令。其中最重要的就是不排序,不排序,不排序,重要的事情说三遍。

-U do not sort; list entries in directory order -U是不排序

关键就在这个-U上。
为什么ls命令出不来结果? 因为ls命令默认会排序,那么如果文件很多,它要先全部读取到,排序后才会显示。

实测下,如果用-U可以出结果,那么说明上述结论成立:
​​​ls -1 -f | head -n 1000​​​ 网上的命令。
​​​ls -U | head -n 1000​​ 不用-f,用-U试下,同样可以很快出结果。

找到了根源,那么就好处理了。

统计行数

方案一 直接统计

​ls -U | wc -l​​​ ,实测速度可以,1分钟以内出结果,661783条。
优点,如果条数不是超多,且只要条数不要文件名列表,该命令很简单。

方案二 先把文件名输出到文件,然后在统计那个文件

拿到文件名列表,那后面的就简单了。无论是统计行数,还是进行迁移操作都能实现了。
拿文件列表有2种方案,分别试下。

追加写入(推荐)
echo ""> /data/total-name.txt;
ls -U -1 >> /data/total-name.txt & # &表示后台运行,会在控制台输出一个pid
假设:pid为15238

ps -ef | grep 15238 如果这个进程没了,表示执行完毕

时间比较短,结果:
16763778 字节
661687 行

覆盖写入
echo ""> /data/total-name.txt;
ls -U -1 > /data/total-name.txt &
pid为16505
ps -ef | grep 16505;

时间相当长,最后的结果:
16765257字节
661744行

经过对比,2种方式结果一致 。但追加写入的方式速度快很多,推荐。