一、先看需求
用一行脚本:列出当前目录下的所有文件及子文件的路径、文件大小、字符数并且汇总文件总数及总大小。(一行脚本?!丫的,不是好人🙃)
记得排除
node_modules目录及.git目录。
二、看效果图
三、需求分析
- 列出当前目录下的所有文件:
- 很快能想到
ls命令吧。
- 列出当前目录下的所有文件及子文件的路径:
ls -lR可以实现,但是如何拼接成完整路径?怎么过滤不需要的文件夹?
- 列出当前目录下的所有文件及子文件的大小:
ls可以查看文件大小
- 列出当前目录下的所有文件及子文件的字符数:
wc -w可以做到。但是必须获得文本内容才可以统计
- 汇总文件总数:
nlcat可以统计行号,配合ls问题不大吧nl -b a xxcat -n xx
- 汇总文件总大小:
du -sh貌似可以做到
四、源码
find . -path "./node_modules" -prune -o -path "./.git" -prune -o -type f | xargs ls -ld | grep "^-" | awk 'BEGIN{sum=0;conut=0;text=""}{sum+=$5;count+=1;text=text"\n"count" "$9" --- "$5" byte"}END{print text "\n\n" "总文件数:"count ",文件占用:"sum" 字节" }' | while read line; do echo $line | grep -o './.* -' | grep -o '^./.*\w' | xargs cat | wc -m | xargs echo $line ,word_count: | sed 's/,word_count: 0//g' | xargs echo; done
五、源码分析
涉及到 Linux 命令合集:
findlsxargsgrepawkreadechocatwcsed
-
Linux 命令介绍
find:Linux find 命令用于在指定目录下查找文件和目录。参数说明,请参考:Linux find 命令|:Linux 管道符,用于 Linux 程序之间,Linux 命令之间以及 Linux 程序和命令之间的通信。例如:command1 | command2 | command3代表着 command1 的标准输出作为 command2 的标准输入使用,而 command2 的标准输出又作为 command3 的标准输入使用。ls:Linux ls 命令用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。参数说明,请参考:Linux ls 命令xargs:xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据,也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。参数说明,请参考:Linux xargs 命令grep:Linux grep 命令用于查找文件里符合条件的字符串或正则表达式。参数说明,请参考:Linux grep 命令awk:AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。参数说明,请参考:Linux awk 命令while ...; do ...; done:Shell 脚本 while 循环语句表达式。read:Linux read 命令用于从标准输入读取数值。参数说明,请参考:Linux read 命令echo:Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。请参考:Shell echo命令cat:Linux cat 命令用于连接文件并打印到标准输出设备上。参数说明,请参考:Linux cat 命令wc:Linux wc命令用于计算字数。参数说明,请参考:Linux wc命令sed:Linux sed 命令是利用脚本来处理文本文件。参数说明,请参考:Linux sed 命令
-
源码解析:
find . -path "./node_modules" -prune -o -path "./.git" -prune -o -type f-path "./node_modules" -prune -o:表示排除node_modules目录-path "./.git" -prune -o:表示排除.git目录find . -type f查找当前目录下所有的文件及子文件,-type f表示 file
xargs ls -ld- 列出输入流的文件属性,形如:
-rw-r--r-- 1 800947 1049089 591787 4月 20 14:18 yarn.lock
grep "^-"- 过滤输入流中以
-开头的行,即文件类型
awk 'BEGIN{sum=0;conut=0;text=""}{sum+=$5;count+=1;text=text"\n"count" "$9" --- "$5" byte"}END{print text "\n\n" "总文件数:"count ",文件占用:"sum" 字节" }'- 遍历截取文件路径(
$9)文件大小($5),并进行数量统计
echo $line | grep -o './.* -' | grep -o '^./.*\w'- 处理当前遍历行的完整路径
xargs cat | wc -m | xargs echo- 读取当前行的完整路径的文件的文本内容进行字数统计
sed 's/,word_count: 0//g'- 清理不需要统计的数据行
六、总结
这是我上班摸鱼一天研究出的成果,觉得不错的话欢迎~ 👋😄