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选项来包含。

在我的电脑上, rsyncfind | 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