递归统计 Linux 目录中的文件数量

2024-10-23 08:47:00
admin
原创
232
摘要:问题描述:如何递归计算 Linux 目录中的文件数量?我发现了这个:find DIR_NAME -type f ¦ wc -l 但是当我运行它时它返回以下错误。查找:路径必须在表达式之前:¦解决方案 1:这应该有效:find DIR_NAME -type f | wc -l 解释:-type f仅包含文件。|...

问题描述:

如何递归计算 Linux 目录中的文件数量?

我发现了这个:

find DIR_NAME -type f ¦ wc -l

但是当我运行它时它返回以下错误。

查找:路径必须在表达式之前:¦


解决方案 1:

这应该有效:

find DIR_NAME -type f | wc -l

解释:

  • -type f仅包含文件。

  • |而不是¦)将find命令的标准输出重定向到wc命令的标准输入。

  • wc(字数统计的缩写)计算输入(文档)中的换行符、单词和字节数。

  • -l仅计算换行符。

笔记:

  • 替换DIR_NAME.在当前文件夹中执行命令。

  • 您还可以删除-type f计数中包含的目录(和符号链接)。

  • 如果文件名可以包含换行符,则此命令可能会计数过多。

关于您的示例不起作用的原因的解释:

在您显示的命令中,您没有使用“管道”( |) 来连接两个命令,而是使用断线 ( ¦),shell 无法将其识别为命令或类似的东西。这就是您收到该错误消息的原因。

解决方案 2:

对于当前目录:

find -type f | wc -l

解决方案 3:

如果您想要了解当前目录下每个目录中有多少个文件:

for i in */ .*/ ; do 
    echo -n $i": " ; 
    (find "$i" -type f | wc -l) ; 
done

当然,这些可以写在一行上。括号明确了wc -l应该监视谁的输出(find $i -type f在本例中)。

解决方案 4:

在我的计算机上,比接受的答案rsync要快一点:find | wc -l

$ rsync --stats --dry-run -ax /path/to/dir /tmp

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简称)选项很重要,因为实际上并不传输文件!

  • 我使用了-x“不跨越文件系统边界”选项,这意味着如果您执行它/并且连接了外部硬盘,它将只计算根分区上的文件。

解决方案 5:

您可以使用

$ tree

使用以下命令安装tree包后

$ sudo apt-get install tree

(在 Debian / Mint / Ubuntu Linux 机器上)。

该命令不仅显示文件数,还分别显示目录数。选项 -L 可用于指定最大显示级别(默认情况下为目录树的最大深度)。

通过提供选项,也可以包含隐藏文件-a

解决方案 6:

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

find DIR_NAME -type f -printf "." | wc -c

注意:该-printf选项仅适用于 GNU findutils 中的 find。您可能需要在 Mac 等设备上安装它。

解决方案 7:

将这里的几个答案结合在一起,最有用的解决方案似乎是:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "
" | wc -l) "{}"' |
sort -n

它可以处理奇怪的事情,比如文件名中包含空格、括号甚至换行符。它还可以按文件数量对输出进行排序。

您可以在之后增加数字,-maxdepth以便子目录也计算在内。请记住,这可能需要很长时间,特别是如果您的目录结构嵌套程度很高,并且-maxdepth数字很大。

解决方案 8:

如果你想知道当前工作目录中有多少个文件和子目录,你可以使用这个单行命令

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

这将在 GNU 风格中发挥作用,并且只需从 BSD linux(例如 OSX)的 echo 命令中省略 -e。

解决方案 9:

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

find YOUR_PATH -name '*.html' -type f | wc -l 

-l只是显示输出的行数。

如果需要排除某些文件夹,请使用-not -path

find . -not -path './node_modules/*' -name '*.js' -type f | wc -l

解决方案 10:

你可以使用命令ncdu。它将递归地计算 Linux 目录中包含的文件数量。以下是输出示例:

在此处输入图片描述

它有一个进度条,如果你有许多文件的话这会很方便:

在此处输入图片描述

要在 Ubuntu 上安装:

sudo apt-get install -y ncdu

基准:我使用https://archive.org/details/cv_corpus_v1.tar (380390 个文件,11 GB) 作为需要计算文件数量的文件夹。

  • find . -type f | wc -l:大约需要 1 分 20 秒完成

  • ncdu:大约需要 1 分 20 秒完成

解决方案 11:

tree $DIR_PATH | tail -1

示例输出:

5309 个目录,2122 个文件

解决方案 12:

如果您想避免错误情况,请不要允许wc -l查看带有换行符的文件(它将算作 2 个以上的文件)

例如,假设我们有一个文件,里面有一个 EOL 字符

> mkdir emptydir && cd emptydir
> touch $'file with EOL(
) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

由于至少 gnu 似乎wc没有读取/计算以空字符结尾的列表的选项(除了从文件),最简单的解决方案就是不传递文件名,而是每次找到文件时都进行静态输出,例如在与上述相同的目录中

> find -type f -exec printf '
' ; | wc -l
1

或者如果你find支持它

> find -type f -printf '
' | wc -l
1 

解决方案 13:

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

如果您只想计算文件而不包含符号链接(这只是您可以做的其他操作的一个示例),您可以使用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

解决方案 14:

find . -type f -name '*.fileextension' | wc -l

将 . 替换为目录路径,将文件扩展名替换为真实扩展名。例如,如果您要查找所有 png 文件,则将其替换为 *.png

解决方案 15:

对于名称中带有空格的目录...(基于上面的各种答案) - 递归打印目录名称及其中的文件数:

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done

示例(已格式化以便于阅读):

pwd
  /mnt/Vancouver/Programming/scripts/claws/corpus

ls -l
  total 8
  drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
  drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'

ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
  138

## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
  29

使用以下方式可以更好地可视化目录结构tree

tree -L 3 -F .
  .
  ├── Catabolism - Autophagy; Phagosomes; Mitophagy/
  │   ├── 1
  │   ├── 10
  │   ├── [ ... SNIP! (138 files, total) ... ]
  │   ├── 98
  │   └── 99
  └── Catabolism - Lysosomes/
      ├── 1
      ├── 10
      ├── [ ... SNIP! (28 files, total) ... ]
      ├── 8
      ├── 9
      └── aaa/
          └── bbb

  3 directories, 167 files

man find | grep mindep
  -mindepth levels
    Do not apply any tests or actions at levels less than levels
    (a non-negative integer).  -mindepth 1 means process all files
    except the starting-points.

ls -p | grep -v /(下面使用)来自https://unix.stackexchange.com/questions/48492/list-only-regular-files-but-not-directories-in-current-directory的答案 2

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1

应用: 我想在几百个目录中找出最大文件数(所有深度 = 1)[以下输出再次格式化以便于阅读]:

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[victoria@victoria 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[victoria@victoria 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/: /g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -V是一种自然排序。... 因此,我在任何这些 (Claws Mail) 目录中的最大文件数是 4375 个文件。如果我用左填充 ( https://stackoverflow.com/a/55409116/1904943 ) 这些文件名(它们在每个目录中都以数字形式命名,从 1 开始)并填充到总共 5 位数字,那么应该没问题。


附录

查找目录中的文件、子目录的总数。

$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS

$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News

Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine

$ find . -type f | wc -l
70214    ## files

$ find . -type d | wc -l
417      ## subdirectories

解决方案 16:

使用 bash:

使用 ( ) 创建一个条目数组,并使用 # 获取计数。

FILES=(./*); echo ${#FILES[@]}

好的,这不会递归计算文件数,但我想先展示一下简单的选项。一个常见的用例可能是创建文件的滚动备份。这将创建 logfile.1、logfile.2、logfile.3 等。

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

启用bash 4+ 的递归计数globstar(如 @tripleee 所述)

FILES=(**/*); echo ${#FILES[@]}

要递归获取文件数,我们仍然可以以相同的方式使用 find。

FILES=(`find . -type f`); echo ${#FILES[@]}

解决方案 17:

我们可以使用tree命令,它会递归显示所有文件和文件夹。同时,它会在输出的最后一行显示文件夹和文件的数量。

$ tree path/to/folder/
path/to/folder/
├── a-first.html
├── b-second.html
├── subfolder
│   ├── readme.html
│   ├── code.cpp
│   └── code.h
└── z-last-file.html

1 directories, 6 files

对于 tree 命令中的最后一行输出,我们可以对其输出使用 tail 命令

$ tree path/to/folder/ | tail -1
1 directories, 6 files

为了安装树,我们可以使用以下命令

$ sudo apt-get install tree

解决方案 18:

这里有很多正确答案。这里还有另一个!

find . -type f | sort | uniq -w 10 -c

其中.,是查找的文件夹,10是用于对目录进行分组的字符数。

解决方案 19:

我编写了ffcnt来加速特定情况下的递归文件计数:旋转磁盘和支持范围映射的文件系统。

ls它可以比基于的方法快一个数量级find,但 YMMV。

解决方案 20:

假设您想要每个目录的总文件数,请尝试:

for d in `find YOUR_SUBDIR_HERE -type d`; do 
   printf "$d - files > "
   find $d -type f | wc -l
done

对于当前目录尝试这个:

for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done;

如果您有较长的空间名称,则需要更改 IFS,如下所示:

OIFS=$IFS; IFS=$'
'
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done
IFS=$OIFS

解决方案 21:

这种通过格式过滤的替代方法可以计算所有可用的 grub 内核模块:

ls -l /boot/grub/*.mod | wc -l

解决方案 22:

根据以上回复和评论,我得出了以下文件计数列表。特别是它结合了@Greg Bell 提供的解决方案以及@Arch Stanton 和@Schneems 的评论

统计当前目录及子目录中的所有文件

function countit { find . -maxdepth 1000000 -type d -print0 | while IFS= read -r -d '' i ; do file_count=$(find "$i" -type f | wc -l) ; echo "$file_count: $i" ; done }; countit | sort -n -r >file-count.txt

统计当前目录及子目录中给定名称的所有文件

function countit { find . -maxdepth 1000000 -type d -print0 | while IFS= read -r -d '' i ; do file_count=$(find "$i" -type f | grep <enter_filename_here> | wc -l) ; echo "$file_count: $i" ; done }; countit | sort -n -r >file-with-name-count.txt

解决方案 23:

以下解决方案对于 SSD 特别有用(因为它设计为在 SSD 上快速运行):

可以使用gdu。它将递归计算 Linux 目录中包含的文件数。以下是输出示例(dundee的演示):

在此处输入图片描述

要在 Ubuntu 上安装:

sudo add-apt-repository ppa:daniel-milde/gdu
sudo apt-get update
sudo apt-get install gdu

请参阅 其他操作系统的安装页面 以及如何安装 Gdu 的方法。

来自自述文件:

Gdu 主要针对 SSD 磁盘,可以充分利用并行处理。不过 HDD 也可以,只是性能提升不是很大。

自述文件指向类似的程序:

  • ncdu  - 基于 NCurses 的纯 C (LTS)或 zig (稳定)编写的工具

  • godu  - 具有类似旋转木马的用户界面的分析器

  • duaRust - 使用 与 gdu(和 ncdu)类似的界面 编写的工具

  • diskus  - 用以下语言编写的非常简单但非常快速的工具 Rust

  • duc  - 具有多种检查和可视化磁盘使用情况的工具集合

  • dustRust - 以 树状结构显示磁盘使用情况的 工具

  • pduRust - 以 树状结构显示磁盘使用情况的 工具

解决方案 24:

查找 -type f | wc -l

或(如果目录是当前目录)

查找 . -type f | wc -l

解决方案 25:

这完全没问题。简单简短。如果你想计算文件夹中存在的文件数量。

ls | wc -l

解决方案 26:

ls -l | grep -e -x -e -dr | wc -l 
  1. 长列表

  2. 过滤文件和目录

  3. 统计已过滤的行数

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2577  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   26  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   21  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用