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_NAME
replace为.
在当前文件夹中执行命令。 - 您也可以删除
-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