递归计算Linux目录中的文件

时间:2012-02-06 07:59:19

标签: linux

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

我发现了这个:

find DIR_NAME -type f ¦ wc -l

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

  

find:路径必须在表达式之前:|

22 个答案:

答案 0 :(得分:1083)

这应该有效:

find DIR_NAME -type f | wc -l

<强>解释

  • -type f仅包含文件。
  • |而不是¦ )将find命令的标准输出重定向到wc命令的标准输入。
  • wc(字数统计的缩写)计算其输入上的换行符,字和字节(docs)。
  • -l只计算换行符。

注意:

  • DIR_NAME替换为.以执行当前文件夹中的命令。
  • 您还可以删除计数中的-type f以包含目录(和符号链接)。
  • 如果文件名可以包含换行符,则此命令可能会超量计算。

说明您的示例不起作用的原因:

在您显示的命令中,您不使用“管道”(|)来连接两个命令,但是shell无法识别的断条(¦)命令或类似的东西。这就是你收到错误信息的原因。

答案 1 :(得分:78)

对于当前目录:

find -type f | wc -l

答案 2 :(得分:60)

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

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)。

答案 3 :(得分:47)

您可以使用

$ tree
使用

安装包后

$ sudo apt-get install tree

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

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

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

答案 4 :(得分:37)

在我的计算机上,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

第二行包含文件数,在上例中为150,481。作为奖励,您还可以获得总大小(以字节为单位)。

说明:

  • 第一行是文件,目录,符号链接等的统计,这就是为什么它比第二行更大的原因。
  • --dry-run(或简称-n)选项对于实际传输文件非常重要!
  • /xxx参数可以是任何空文件夹或非现有文件夹。不要在这里使用/
  • 我使用-x选项来“#34;不要跨越文件系统边界&#34;”,这意味着如果您为/执行它并且连接了外部硬盘,那么只计算根分区上的文件。

答案 5 :(得分:15)

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

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

它可以处理奇怪的事情,例如包含空格括号甚至是新行的文件名。它还根据文件数对输出进行排序。

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

答案 6 :(得分:15)

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

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

答案 7 :(得分:8)

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

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

这将在GNU flavor中起作用,并且只是从BSD linux的echo命令(例如OSX)中省略-e。

答案 8 :(得分:7)

如果您想避免错误案例,请不要让wc -l查看带有换行符的文件(它将被视为2个以上的文件)

e.g。考虑一种情况,我们只有一个文件,其中包含一个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

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

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

或者,如果find支持

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

答案 9 :(得分:5)

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

enter image description here

它有一个进度条,如果你有很多文件就很方便:

enter image description here

要在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秒完成

答案 10 :(得分:4)

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

答案 11 :(得分:3)

tree $DIR_PATH | tail -1

示例输出:

  

5309个目录,2122个文件

答案 12 :(得分:2)

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

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

-l仅用于显示输出中的行数。

答案 13 :(得分:1)

对于名称中带有空格的目录...(基于上述各种答案)-递归打印目录名称,其中包含以下文件数量:

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}$)/\2: \1/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

答案 14 :(得分:1)

使用bash:

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

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

好的,它没有递归计算文件,但我想首先显示简单的选项。常见用例可能是创建文件的翻转备份。这将创建logfile.1,logfile.2,logfile.3等。

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

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

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

答案 15 :(得分:1)

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

它比基于var searchResponse = client.Search<MyObject>(s => s .Query(q => q.Term(P => P.Category, "a")) .Source(f => f.Includes(si => si.Fields(ff => ff.Keywords))) .Aggregations(a => a .Terms("Keywords", t => t .Field(f => f.Keywords.Suffix("keyword")) .Size(10) ) ) ); ls的方法快一个数量级,但是YMMV。

答案 16 :(得分:0)

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

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

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

答案 17 :(得分:-1)

find -type f | wc -l <​​/ p>

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

找到。 -type f | wc -l <​​/ p>

答案 18 :(得分:-1)

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

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

答案 19 :(得分:-1)

你可以尝试:

find `pwd` -type f -exec ls -l {} ; | wc -l

答案 20 :(得分:-3)

这将完全正常。简单的简短。如果要计算文件夹中存在的文件数。

ls | wc -l

答案 21 :(得分:-3)

ls -l | grep -e -x -e -dr | wc -l 
  1. 长列表
  2. 过滤文件和目录
  3. 计算过滤后的行号