recursion计算Linux目录中的文件
我如何recursion计算Linux目录中的文件?
我find了这个:
find DIR_NAME -type f ¦ wc -l 但是当我运行它会返回以下错误。
发现:path必须在expression式之前:|
这应该工作:
 find DIR_NAME -type f | wc -l 
说明:
-   -type f只包含文件。
-  |( 而不是¦)将命令的标准输出redirect到wc命令的标准input。
-   wc(单词计数的简写)在其input( 文档 )上计算换行符,单词和字节。
-   -l只算换行符。
笔记:
-  将DIR_NAMEreplace为.在当前文件夹中执行命令。
-  您也可以删除-type f以包含目录(和符号链接)在计数中。
- 如果文件名可以包含换行符,那么这个命令可能会计数过多。
解释为什么你的例子不起作用:
 在你显示的命令中,不要使用“Pipe”( | )来连接两个命令,而是使用shell不能识别的命令或类似命令( ¦ )。 这就是为什么你得到这个错误信息。 
对于当前目录:
 find . -type f | wc -l 
如果您想要了解当前目录下每个目录中有多less个文件,请执行以下操作:
 for i in $(find . -maxdepth 1 -type d) ; do echo -n $i": " ; (find $i -type f | wc -l) ; done 
 当然,这可以全部在一条线上。 圆括号说明了谁的输出wc -l应该在看(在这种情况下find $i -type f )。 
您可以使用
 $ tree 
安装树形包后
 $ sudo apt-get install tree 
(在Debian / Mint / Ubuntu Linux机器上)。
该命令不仅显示文件的数量,还显示目录的数量。 选项-L可用于指定最大显示级别(默认情况下,该级别是目录树的最大深度)。
 隐藏文件也可以通过提供-a选项来包含。 
 在我的电脑上, rsync比find | wc -l更快一点  find | wc -l在接受的答案中。 例如,你可以像这样计算/Users/joe/的文件: 
 [joe:~] $ rsync --stats --dry-run -ax /Users/joe/ /xxx Number of files: 173076 Number of files transferred: 150481 Total file size: 8414946241 bytes Total transferred file size: 8414932602 bytes 
第二行有上面例子中的150,481个文件。 作为奖励,你也可以得到总大小(以字节为单位)。
备注:
- 第一行是文件,目录,符号链接等所有在一起的计数,这就是为什么它比第二行更大。
-   --dry-run(或简称为-n)选项对于不实际传输文件非常重要!
-   /xxx参数可以是任何空的或不存在的文件夹。 不要在这里使用。
-  我使用了-x选项来“不跨越文件系统边界”,这意味着如果你为/执行它并且连接了外部硬盘,它将只计算根分区上的文件。
结合这里的几个答案,最有用的解决scheme似乎是:
 find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' | sort -n 
它可以处理奇怪的事情,如文件名,包括空格括号,甚至新行。 它也按照文件数sorting输出。
你可以增加-maxdepth之后的数字来获得子目录。 请记住,这可能需要很长时间,特别是如果您有一个高度嵌套的目录结构与一个高-maxdepth数组合。
如果您想知道当前工作目录中存在多less个文件和子目录,则可以使用这一行
 find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n 
这将在GNU风格工作,只是从BSD linux(例如OSX)的echo命令中省略-e。
 如果你想避免错误的情况下,不要让wc -l看到带有换行符的文件(它将被视为2+文件) 
例如,考虑一个情况,我们有一个单一的EOL字符的文件
 > mkdir emptydir && cd emptydir > touch $'file with EOL(\n) character in it' > find -type f ./file with EOL(?) character in it > find -type f | wc -l 2 
 由于至lessgnu wc似乎没有读取/计数空终止列表的选项(文件除外),所以最简单的解决办法就是不传递文件名,而是每次find文件时都要输出静态文件,例如在与上面相同的目录中 
 > find -type f -exec printf '\n' \; | wc -l 1 
 或者如果你的find支持它 
 > find -type f -printf '\n' | wc -l 1 
 要确定当前目录中有多less个文件,请inputls -1 | wc -l  ls -1 | wc -l 。 这使用wc来计算ls -1输出中的行数(-l) 。 它不包括dotfiles。 请注意, ls -l (在前面的例子中,这是一个“L”而不是“1”),我在以前版本的HOWTO中使用的实际上会给你一个大于实际计数的文件数。 感谢Kam Nejad的这一点。 
 如果你只想计算文件而不包括符号链接(只是你可以做什么的一个例子),你可以使用ls -l | grep -v ^l | wc -l ls -l | grep -v ^l | wc -l  ls -l | grep -v ^l | wc -l (这次是“L”不是“1”,这里我们需要一个“long”列表)。  grep检查任何以“l”(指示链接)开始的行,并丢弃该行(-v)。 
 相对速度:“ls-1 / usr / bin / | wc -l”在卸载486SX25(本机上的/ usr / bin /有355个文件)上大约需要1.03秒。  “ ls -l /usr/bin/ | grep -v ^l | wc -l ”大约需要1.19秒。 
资料来源: http : //www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
你可以尝试:
 find `pwd` -type f -exec ls -l {} ; | wc -l 
我想给一个不同的格式过滤方法。 示例统计所有可用的grub内核模块:
 ls -l /boot/grub/*.mod | wc -l 
ls -l | grep -e -x -e -dr | wc -l
1.长列表2.筛选文件和目录3.计算已过滤的行号
这里有很多正确的答案。 这是另一个!
 find . -type f | sort | uniq -w 10 -c 
 哪里. 是查找的文件夹, 10是目录分组的字符数。 
我已经写了ffcnt来加速在特定情况下的recursion文件计数:旋转磁盘和支持扩展映射的文件系统。
 它可以比ls快一个数量级,或者find基于方法,但是YMMV。 
用bash:
用()创build一个条目数组,并用#来获得计数。
 FILES=(./*); echo ${#FILES[@]} 
好吧,不recursion计数文件,但我想先显示简单的选项。 常见的用例可能是创build文件的翻转备份。 这将创buildlogfile.1,logfile.2,logfile.3等
 CNT=(./logfile*); mv logfile logfile.${#CNT[@]} 
为了recursion计算文件数量,我们仍然可以用相同的方法使用find。
 FILES=(`find . -type f`); echo ${#FILES[@]} 
find -type f | wc -l
或者(如果目录是当前目录)
找 。 -type f | wc -l