能写出这个脚本,Linux算入门了吧?

2,525 阅读1分钟

一、先看需求

用一行脚本:列出当前目录下的所有文件及子文件的路径、文件大小、字符数并且汇总文件总数及总大小。(一行脚本?!丫的,不是好人🙃)

记得排除 node_modules 目录及 .git 目录。

二、看效果图

25f4202664d22a28.png

三、需求分析

  1. 列出当前目录下的所有文件:
  • 很快能想到 ls 命令吧。
  1. 列出当前目录下的所有文件及子文件的路径:
  • ls -lR 可以实现,但是如何拼接成完整路径?怎么过滤不需要的文件夹?
  1. 列出当前目录下的所有文件及子文件的大小:
  • ls 可以查看文件大小
  1. 列出当前目录下的所有文件及子文件的字符数:
  • wc -w 可以做到。但是必须获得文本内容才可以统计
  1. 汇总文件总数:
  • nl cat 可以统计行号,配合 ls 问题不大吧
    • nl -b a xx
    • cat -n xx
  1. 汇总文件总大小:
  • 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 命令合集: find ls xargs grep awk read echo cat wc sed

  • 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'
    
    • 清理不需要统计的数据行

六、总结

这是我上班摸鱼一天研究出的成果,觉得不错的话欢迎~ 👋😄