一行命令统计出多个文件夹中的多种类型的代码行数 郝伟 2021/02/04 [TOC]
1. 问题
现在有这些文件夹,里面有不类类型的文件,包括Java,C#和C++。如果我们想知识中间的代码行数应该如何完成呢?
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200105_MemorySpeedTest
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200411_EmbededEncryption
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200412_EncryptTest
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200504_DHTEncryption
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200505_BigNumber
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200521_CountDownLatchTest
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200522_ImageEncrpytion
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200527_HighSpeedEncryption
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200529_PerformanceOfLookup-Table
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200604_Kad_Simulation
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200607_NodePathSelectonTest
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200607_StringVSStringBuilder
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200609_IPHiddenInMD5
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200611_ExposureLevel
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200615_AuthenticationTest
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200618_Tomcat_ByteORCharCommunication
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200623_ECDSA
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200623_RSAImplmentation
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200720_ZLibDemo
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200827_TheadInvokePerformance
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20200901_Tomcat_Performance_Test
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20201002_ElevatorSimulator
drwxrwxrwx 1 hao hao 4.0K Feb 4 17:15 20201004_cmake_demo
2. 解决
其实只需要一行Linux命令即可完成,代码如下:
for file in *.cpp *.java *.cs; do find -name $file | xargs wc ; done
这条命令虽然短,但是却有以下五个知识点:
- for 循环:用于分别处理
*.cpp *.java *.cs
三种文件格式; - find 命令:用于查询目录中指定的文件类型;
- 通道命令
|
:用于参数传递; - xargs 命令:用于控制通道中的参数;
- wc命令:用于单词的行数、单词数和字符数的统计。
不过命令很容易看明白,对 *.cpp
,*.cs
和 *.java
进行了统计,如果需要其他的格式,只需要修改此处即可。另外在命令 find
后面有个点表示当前路径,如果需要查询其他路径,修改此处即可。
3. 执行结果
结果如下所示。可以看到,我们实现了对三种类型的源文件的统计,并且每种类型还有一个总计,达到了预期的效果。
hao@DESKTOP-G66M8U4:/mnt/d/codetemp$ for file in *.cpp *.java *.cs; do find . -name $file | xargs wc ; done
29 90 827 ./20200720_ZLibDemo/CmakeDemo/main.cpp
45 200 1394 ./20200720_ZLibDemo/zlib/main.cpp
111 289 2521 ./20200827_TheadInvokePerformance/source.cpp
30 91 639 ./20201004_cmake_demo/demo1/main.cpp
18 55 443 ./20201004_cmake_demo/demo2/main.cpp
16 44 290 ./20201004_cmake_demo/demo2/MathFunctions.cpp
660 2270 20751 ./20201004_cmake_demo/demo3/comp/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp
18 55 448 ./20201004_cmake_demo/demo3/main.cpp
16 44 290 ./20201004_cmake_demo/demo3/math/MathFunctions.cpp
37 103 824 ./20201004_cmake_demo/demo4/main.cpp
16 44 290 ./20201004_cmake_demo/demo4/math/MathFunctions.cpp
996 3285 28717 total
38 160 1283 ./20200105_MemorySpeedTest/MemoryTest.java
206 645 6544 ./20200411_EmbededEncryption/Netnode.java
181 561 5625 ./20200412_EncryptTest/EncryptTest.java
34 141 970 ./20200412_EncryptTest/XorDemo.java
242 678 8616 ./20200504_DHTEncryption/DHCoder.java
164 563 6164 ./20200504_DHTEncryption/DHTest.java
183 431 6399 ./20200504_DHTEncryption/DHTest1.java
119 339 2511 ./20200504_DHTEncryption/Person.java
36 107 1128 ./20200505_BigNumber/BigNumberDemo.java
55 156 1966 ./20200505_BigNumber/LargeNumber.java
62 192 1375 ./20200505_BigNumber/LargeNumberMultiply.java
46 106 1718 ./20200521_CountDownLatchTest/CountDownLatchDemo.java
136 859 4956 ./20200527_HighSpeedEncryption/FileEncryption.java
109 449 2789 ./20200529_PerformanceOfLookup-Table/TrigonometricTest.java
186 810 7133 ./20200604_Kad_Simulation/KadNode.java
228 889 6679 ./20200607_NodePathSelectonTest/Node.java
295 1124 9349 ./20200607_NodePathSelectonTest/T20200608_VPSSelectionDemo.java
57 219 1687 ./20200607_StringVSStringBuilder/DasenBallDemo.java
99 469 3507 ./20200609_IPHiddenInMD5/HashTest.java
50 248 1344 ./20200611_ExposureLevel/T20200611_ExposureLevel.java
114 472 4117 ./20200615_AuthenticationTest/AuthenticationTest.java
125 543 4429 ./20200615_AuthenticationTest/AuthenticationTest2.java
64 180 2077 ./20200618_Tomcat_ByteORCharCommunication/GetPost.java
64 151 1841 ./20200618_Tomcat_ByteORCharCommunication/NewServ.java
58 205 2269 ./20200623_ECDSA/ECDHA1.java
160 516 6003 ./20200623_ECDSA/ECDHA2.java
106 393 4535 ./20200623_RSAImplmentation/RSAUtil.java
99 379 4502 ./20200623_RSAImplmentation/RSAUtils.java
3316 11985 111516 total
20 35 367 ./20200522_ImageEncrpytion/WindowsFormsApp1/BaseForm.cs
49 134 1377 ./20200522_ImageEncrpytion/WindowsFormsApp1/BaseForm.Designer.cs
21 48 475 ./20200522_ImageEncrpytion/WindowsFormsApp1/Common.cs
119 333 2813 ./20200522_ImageEncrpytion/WindowsFormsApp1/FastEncryption.cs
55 107 1407 ./20200522_ImageEncrpytion/WindowsFormsApp1/FastEncryptionForm.cs
218 626 9263 ./20200522_ImageEncrpytion/WindowsFormsApp1/FastEncryptionForm.Designer.cs
157 618 4258 ./20200522_ImageEncrpytion/WindowsFormsApp1/Form1.cs
203 549 9072 ./20200522_ImageEncrpytion/WindowsFormsApp1/Form1.Designer.cs
51 101 1539 ./20200522_ImageEncrpytion/WindowsFormsApp1/HideMessageForm.cs
164 464 7057 ./20200522_ImageEncrpytion/WindowsFormsApp1/HideMessageForm.Designer.cs
215 751 5950 ./20200522_ImageEncrpytion/WindowsFormsApp1/ImageHider.cs
88 165 2459 ./20200522_ImageEncrpytion/WindowsFormsApp1/MainForm.cs
247 680 11233 ./20200522_ImageEncrpytion/WindowsFormsApp1/MainForm.Designer.cs
4 14 214 ./20200522_ImageEncrpytion/WindowsFormsApp1/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
25 41 591 ./20200522_ImageEncrpytion/WindowsFormsApp1/Program.cs
36 78 1324 ./20200522_ImageEncrpytion/WindowsFormsApp1/Properties/AssemblyInfo.cs
71 133 2497 ./20200522_ImageEncrpytion/WindowsFormsApp1/Properties/Resources.Designer.cs
30 71 1025 ./20200522_ImageEncrpytion/WindowsFormsApp1/Properties/Settings.Designer.cs
54 112 1484 ./20200522_ImageEncrpytion/WindowsFormsApp1/ReadInfoForm.cs
131 370 5283 ./20200522_ImageEncrpytion/WindowsFormsApp1/ReadInfoForm.Designer.cs
1958 5430 69688 total
4. 扩展
实际上对于多种文件格式,如果需要一起统计,还有可以有不需要循环的更简单的办法: 以下代码的作用均是显示
4.1. 方法1:使用 -regextype posix-extended -regex,如:
find . -type f -regextype posix-extended -regex '.*.(cpp|h)' | xargs wc > staticstics.txt
4.2. 方法2:使用多次查询 -name "*.cpp" -o -name "*.h" 联立
通过使用 -o
可以将多个 -name pattern
联立起来,从而达到查询多种类型的目的。
find . -name "*.cpp" -o -name "*.h" | xargs wc > staticstics.txt
4.3. 其他方法
```bash find . -type f -iname ".cpp" -o -iname ".h" find . -type f ( -name ".h" -o -name ".cpp" ) find . -type f -regex '.(.h|.cpp)' find . -type f -regextype posix-extended -regex '..(cpp|h)'
``
5. 参考资料
Linux中find命令用法大全,https://www.cnblogs.com/Ido-911/p/9638612.html unix find multiple file types,https://stackoverflow.com/questions/7190565/unix-find-multiple-file-types