一行命令统计出多个文件夹中的多种类型的代码行数 郝伟 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

results matching ""

    No results matching ""