统计一个目录下所有普通文件的总行数

1. 统计一个目录下所有普通文件的总行数

#实用场景:毕业设计时,需要统计自己的代码行数#

  

方案一:find . -type f -name "*.c" -exec cat {} \; | grep -v ‘^$‘ | wc -l

    解释:find . -type f -name "*.c" 查找当前目录下所有以.c结尾的文件,如果不考虑文件类型,可以直接实用find . -type f即可。 -exec cat {} \; 是将找到的文件采用cat命令输出; grep -v ‘^$‘ 是将不是空行的内容进行统计,如果是空行就不统计,它相当于一个过滤器。 wc -l 统计输出来的代码的行数。如果不需要

对空行进行过滤的话,可以省去grep -v ‘^$‘

  方案二:find . -type f -exec wc -l {} \; | awk ‘{sum+=$1}END{print sum}‘

    解释:find命令同方案一。-exec wc -l 是指将找到的文件依次计算其中的行数,此时如果输出的话,会输出类似于

22 main.c

43 head1.h

67 head1.c

所以还要采用awk将第一列进行相加,由sum+=$1,很明显,比较容易理解awk的含义。但此种方法没有对空行进行过滤。

  方案三:find . -type f | xargs wc -l
    解释:使用xargs与方案二的差异在于在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

对于方案三,系统会显示每个文件的行数,然后显示总行数:

14 ./main.c
  8 ./abc.c
  8 ./folder/main.c
  8 ./folder/shaoning/test.c
 38 总用量

思考题:(重点是理解xargs的含义)

知道指定后缀名的文件总个数命令:(得到的是html文件的数目)

  find . -name "*.html" | wc -l

知道一个目录下代码总行数以及单个文件行数:(得到的是每个及所有html文件中内容的行数)

  find . -name "*.html" | xargs wc -l

时间: 2024-10-13 08:08:54

统计一个目录下所有普通文件的总行数的相关文章

linux系统编程----统计一个目录下的普通文件个数

主要是为了统计linux系统下一个指定目录下面的普通文件个数,运用目录操作的一些函数,配合递归调用来实现该功能. 首先介绍一下函数原型: 打开一个空目录                    DIR *opendir(const char *name);                    参数: 目录名                    返回值: 指向目录的指针        读目录                    struct dirent *readdir(DIR *dirp)

删除一个目录下的所有文件,但保留一个指定文件

此题问题虽小,但是初学者还是很难给出合理的答案的!本文来自老男孩21期网络班学员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10  十个文件

JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件

package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要显示文件目录的层级 * 注:运用了递归的算法. */ public class FileDemo3 { public static void main(String[] args) { File dir=new File("F:\\黑马学习日程\\"); //File dir=new Fi

Linux递归解压缩一个目录下的全部文件

gunzip -r hongchangfirst/data 怎样递归删除那些剩余的非log结尾的文件? 先列出确认一下: find hongchangfirst/data -type f ! -name "*.log" 然后真正的删除: find hongchangfirst/data -type f ! -name "*.log" -exec rm -f {} \; 记住后边-exec一定要加空格,否则会出现find: missing argument to `-

linux面试题:删除一个目录下的所有文件,但保留一个指定文件

此题问题虽小,但是初学者还是很难给出合理的答案的!本文来自老男孩21期网络班学员 面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10  十个文件 [[email protected] xx]# touch file{1..10} [[email protected] xx]# ls file1  file10  file2  file3  file4  file5  file6  file7  file8

递归列出一个目录下所有的文件夹和文件

package chapter10; import java.io.File; /** * 列出一个目录下所有的文件夹和文件 * */public class TestFile02 { public static void main(String[] args) { File file = new File("E:\\av"); listFile(file); } public static void listFile(File file) { File[] files = file.

Python计算一个目录下的所有文件的md5值,在Linux系统下面

实现代码如下: #!/usr/bin/python #*-*coding:utf8*-* import os import sys import hashlib def md5sum(data):     with open(data, "rb") as f:         md5 = hashlib.md5()     #赋空值         for i in f.read(4096):    #防止遇到大文件打开太占用内存,所以一次打开4096字节             if

统计一个目录下cpp代码行数,子目录下也能统计

1.参考 http://www.cnblogs.com/ZCplayground/p/6275365.html 方法一样.用了下面这一行神秘代码 DIR *.* /B> LIST.TXT 可以发现 DIR *.cpp /B> LIST.TXT 这样可以生成目录下cpp格式的文件记录 经过研究  我发现 把cpp去掉 DIR *. /B> LIST.TXT 这样就可以获取子目录的目录名 文章开头那个博客用了输出.bat文件并运行,在递归下出现各种问题,经过试验和改进,改为了直接运行指令,指

统计指定目录下所有mp4文件的时长(包含子目录下的文件)

1 # -*- coding:utf-8 -*- 2 # Author :Zcb 3 4 import os 5 from moviepy.editor import VideoFileClip 6 7 file_Dir = u"e:\\test" #加个u 是表示unicode 一般用在中文字符前 8 sum_time =0 9 10 class FileCheck(): 11 def __init__(self): 12 self.file_dir = file_Dir 13 14