如何递归计算Linux目录中的文件?
我找到了这个:
find DIR_NAME -type f ¦ wc -l
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,它返回以下错误.
find:paths必须在表达式之前:|
pau*_*sm4 1218
这应该工作:
find DIR_NAME -type f | wc -l
Run Code Online (Sandbox Code Playgroud)
说明:
-type f
仅包含文件.|
(而不是¦
)将find
命令的标准输出重定向到wc
命令的标准输入.wc
(单词计数的缩写)计算其输入(docs)上的换行符,单词和字节.-l
只计算换行符.笔记:
DIR_NAME
用.
在当前文件夹要执行的命令.-type f
计数中的包含目录(和符号链接).解释为什么您的示例不起作用:
在您显示的命令中,您不使用"Pipe"(|
)来连接两个命令,而是¦
将shell识别为命令或类似内容的损坏的bar().这就是你收到错误信息的原因.
Abh*_*rya 90
对于当前目录:
find -type f | wc -l
Run Code Online (Sandbox Code Playgroud)
Gre*_*ell 67
如果您想要分析当前目录下每个目录中有多少个文件:
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
Run Code Online (Sandbox Code Playgroud)
当然,这可以全部放在一条线上.括号阐明了其输出wc -l
应该在观察(find $i -type f
在这种情况下).
lev*_*lev 48
您可以使用
$ tree
Run Code Online (Sandbox Code Playgroud)
安装树包后用
$ sudo apt-get install tree
Run Code Online (Sandbox Code Playgroud)
(在Debian/Mint/Ubuntu Linux机器上).
该命令不仅显示文件的计数,还显示目录的计数.选项-L可用于指定最大显示级别(默认情况下,是目录树的最大深度).
通过提供-a
选项,也可以包含隐藏文件.
psm*_*ith 38
在我的电脑上,rsync
比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
Run Code Online (Sandbox Code Playgroud)
第二行包含文件数,在上例中为150,481.作为奖励,您还可以获得总大小(以字节为单位).
备注:
--dry-run
(或-n
不实际传输文件的简称)的选择是很重要的!/xxx
参数可以是任何空的或不存在的文件夹.不要/
在这里使用.-x
"不跨文件系统边界" 的选项,这意味着如果你执行它/
并且连接了外部硬盘,它将只计算根分区上的文件.hek*_*mgl 18
由于UNIX中的文件名可能包含换行符(是,换行符),因此wc -l
可能会计算太多文件.我会为每个文件打印一个点,然后计算点数:
find DIR_NAME -type f -printf "." | wc -c
Run Code Online (Sandbox Code Playgroud)
Seb*_*ine 17
将这几个答案结合在一起,最有用的解决方案似乎是:
find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n
Run Code Online (Sandbox Code Playgroud)
它可以处理奇怪的事情,例如包含空格括号甚至是新行的文件名.它还根据文件数对输出进行排序.
您可以在-maxdepth之后增加数字以获得子目录.请记住,这可能需要很长时间,特别是如果您有一个高度嵌套的目录结构与高-maxdepth数字组合.
如果您想知道当前工作目录中存在多少个文件和子目录,您可以使用这个单行程序
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n
Run Code Online (Sandbox Code Playgroud)
这将在GNU flavor中起作用,并且只是从BSD linux的echo命令(例如OSX)中省略-e.
如果您需要递归计算特定文件类型 ,您可以执行以下操作:
find YOUR_PATH -name '*.html' -type f | wc -l
Run Code Online (Sandbox Code Playgroud)
-l
只是为了显示输出中的行数。
如果您需要排除某些文件夹,请使用 -not -path
find . -not -path './node_modules/*' -name '*.js' -type f | wc -l
Run Code Online (Sandbox Code Playgroud)
如果您想避免错误情况,请不要让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
Run Code Online (Sandbox Code Playgroud)
由于至少gnu wc
似乎没有读取/计数空终止列表的选项(从文件除外),最简单的解决方案就是不传递文件名,而是每次找到文件时都是静态输出,例如在与上面相同的目录中
> find -type f -exec printf '\n' \; | wc -l
1
Run Code Online (Sandbox Code Playgroud)
或者如果你find
支持它
> find -type f -printf '\n' | wc -l
1
Run Code Online (Sandbox Code Playgroud)
要确定当前目录中有多少个文件,请输入ls -1 | wc -l
. 这用于计算的输出中wc
的行数。它不计算点文件。请注意,我在本指南的先前版本中使用的(这是一个“L”而不是前面示例中的“1”)实际上会给您一个比实际计数大一的文件计数。感谢 Kam Nejad 的这一点。(-l)
ls -1
ls -l
如果您只想计算文件而不包括符号链接(只是您可以执行其他操作的示例),您可以使用ls -l | grep -v ^l | wc -l
(这次是“L”而不是“1”,我们想要一个“长”列表) 。grep
检查是否有任何以“l”(表示链接)开头的行,并丢弃该行 (-v)。
相对速度:“ls -1 /usr/bin/ | wc -l”在卸载的 486SX25 上大约需要 1.03 秒(该机器上的 /usr/bin/ 有 355 个文件)。《ls -l /usr/bin/ | grep -v ^l | wc -l
》耗时约1.19秒。
资料来源:http ://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
您可以使用命令ncdu
。它将递归计算Linux目录包含多少个文件。这是输出示例:
它有一个进度条,如果您有许多文件,这将很方便:
要在Ubuntu上安装它:
sudo apt-get install -y ncdu
Run Code Online (Sandbox Code Playgroud)
基准测试:我使用https://archive.org/details/cv_corpus_v1.tar(380390个文件,11 GB)作为必须计算文件数量的文件夹。
find . -type f | wc -l
:大约1m20s完成ncdu
:大约1m20s完成 归档时间: |
|
查看次数: |
598583 次 |
最近记录: |