递归计算Linux目录中的文件

Rob*_*ley 667 linux

如何递归计算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().这就是你收到错误信息的原因.

  • `-type f`中的`f`代表文件,`wc -l`代表字数行. (25认同)
  • 如果您的文件中包含换行符,您仍然可以使用 find 来完成此操作,方法是使用 -exec 而不是 print:`find 。-type f -exec echo \; | wc-l`。这样,您实际上并没有输出文件名,而是为遇到的每个文件输出一个空行,无论名称如何,因此行计数在任何情况下都有效。如果您只计算空字符, print0 也可以工作:`find . -type f -print0 | tr -dc '\0' | 厕所-c`。在这种情况下,tr 删除所有非空字符,wc 计算输入的字符数。 (4认同)
  • 不需要`-print`标志 (3认同)
  • 如果文件名可能包含换行符,则可能需要使用`-print0`标志. (3认同)
  • 删除`-type f`以包含计数中的目录 (2认同)
  • @gaboroncancio这将无济于事,除非`wc`的某些实现具有读取空终止列表的选项。请参阅我的答案。 (2认同)

Abh*_*rya 90

对于当前目录:

find -type f | wc -l
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不会考虑包含换行符的文件名. (4认同)
  • 实际上,在某些平台上,您*确实*需要拼出`find .` (4认同)
  • @Kusalanandra 您的评论几乎适用于这里的每个答案。 (3认同)
  • 对于当前目录,您甚至不需要`.` (2认同)

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在这种情况下).

  • 它可能会卡在名称中带有空格的目录中.将第一行改为`find.-maxdepth 1-type d -print0 | 而IFS =读-r -d''我; 做'修复它.请参阅[如何逐行(和/或逐字段)读取文件(数据流,变量)?](http://mywiki.wooledge.org/BashFAQ/001) (7认同)
  • 使用`find`作为外循环只是一个不必要的复杂问题.`for in in*/`; do` (4认同)
  • 函数 countit { for i in $(find .-max深度 1 -type d) ; do file_count=$(find $i -type f | wc -l) ; echo "$file_count: $i" ; 完毕 }; 计数 | 排序-n-r (2认同)

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选项,也可以包含隐藏文件.

  • 从手册页:_By默认树不打印隐藏文件_.你必须提供`-a`选项来包含它们. (11认同)
  • 这实际上是查看目录和文件数量的最简单方法. (4认同)
  • 它还打印所有文件名,因此如果你有很多文件,它会很慢. (4认同)
  • 要在macOS上安装它,使用`brew`并运行`brew install tr​​ee`,最好在运行`brew update`之后. (3认同)
  • 哇,非常好的工具,它可以打印彩色文件夹,仅列出文件夹,输出为 JSON。它可以在几秒钟内列出 34k 文件夹和 51k 文件。奥莱! (3认同)
  • 如果你有很多文件,这是一个_非常_坏主意 (2认同)

psm*_*ith 38

在我的电脑上,rsyncfind | 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"不跨文件系统边界" 的选项,这意味着如果你执行它/并且连接了外部硬盘,它将只计算根分区上的文件.

  • 试过这个。在预先运行两次以填充 fs 缓存后,`find ~ -type f | wc -l` 耗时 1.7/0.5/1.33 秒(真实/用户/系统)。`rsync --stats --dry-run -ax ~ /xxx` 耗时 4.4/3.1/2.1 秒。这是 SSD 上大约 500,000 个文件。 (4认同)

hek*_*mgl 18

由于UNIX中的文件名可能包含换行符(是,换行符),因此wc -l可能会计算太多文件.我会为每个文件打印一个点,然后计算点数:

find DIR_NAME -type f -printf "." | wc -c
Run Code Online (Sandbox Code Playgroud)

  • 嗨:) 我喜欢文件名中的换行符。这使它们更具可读性。 (3认同)

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数字组合.


San*_*rix 9

如果您想知道当前工作目录中存在多少个文件和子目录,您可以使用这个单行程序

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.-maxdepth 1-type d -print0 | xargs -0 -I {} sh -c'echo -e $(find"{}"| wc -l)"{}"'| sort -n` (2认同)
  • 我对其进行了一些修改,它对我来说效果很好:`find . -最大深度 1 -类型 d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | 排序-rn | 少` (2认同)

LeO*_* Li 9

如果您需要递归计算特定文件类型 ,您可以执行以下操作:

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)


Rei*_*ase 7

如果您想避免错误情况,请不要让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)


Sop*_*phy 5

要确定当前目录中有多少个文件,请输入ls -1 | wc -l. 这用于计算的输出中wc的行数。它不计算点文件。请注意,我在本指南的先前版本中使用的(这是一个“L”而不是前面示例中的“1”)实际上会给您一个比实际计数大一的文件计数。感谢 Kam Nejad 的这一点。(-l)ls -1ls -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

  • `ls -l` 必须对每个文件执行 `stat` 系统调用来读取其大小、mtime 和其他属性,这很慢。在大目录(100.000+ 个文件)上运行“ls -l”可能需要几分钟的时间。因此,要仅计算文件数,请始终使用 `ls -1 | wc-l`。 (3认同)

Fra*_*urt 5

您可以使用命令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完成

  • @ hek2mgl我在答案中添加了可复制的基准,我运行了两次,但没有发现`find之间有任何区别。型f | wc -l和ncdu。 (2认同)
  • 是的,看起来“查找”在幕后执行或多或少地执行与“ du”相同的系统调用,“ du”是“ ncdu”的后端。只是把他们拉了一下。 (2认同)

Nes*_*iza 5

tree $DIR_PATH | tail -1
Run Code Online (Sandbox Code Playgroud)

样本输出:

5309目录,2122文件