ls
开关。是否有一些命令行魔术来获取文件计数?#1 楼
使用广泛的“文件”定义ls | wc -l
(请注意,它不计算隐藏文件,并假定文件名不包含换行符)。
要包含隐藏文件(
.
和..
除外)并避免换行符问题,规范的方式是:find . ! -name . -prune -print | grep -c /
或递归: />
find .//. ! -name . -print | grep -c //
评论
wc是一个“字数统计”程序。 -l开关使它计数行。在这种情况下,它将对ls输出中的行进行计数。这也是我一直被教如何获取给定目录的文件计数的方法。
–桑迪
2010年8月24日6:07
请注意,如果输出是管道,则ls会执行ls -1。
– Lesmana
10年8月24日在16:47
不能将所有内容存储在目录中-您已经错过了点文件,还收集了一些额外的行。空目录仍将返回1行。如果调用ls -la,则目录中将显示三行。您想要ls -lA | wc -l跳过。和..条目。但是,您仍然会一一掉队。
–沃伦
2010年8月25日在15:14
空目录为我返回0
–詹姆斯·罗斯(James Roth)
2013年9月24日在2:16
一种更正的方法是:ls -q | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |。 wc -l-但是请注意,此方法仍不会计算隐藏文件,并且将计算目录。
– godlygeek
15年3月3日在22:30
#2 楼
对于狭窄的文件定义: find . -maxdepth 1 -type f | wc -l
评论
当然,您可以省略-maxdepth 1以递归计数文件(或将其调整为所需的最大搜索深度)。
–user7089
2014年8月3日在16:25
如果您的文件名包含换行符,则此方法将错误地对其计数两次。
– godlygeek
15年3月3日在22:20
一种更正的方法是,不会重复计算名称中带有换行符的文件,方法是:find -maxdepth 1 -type f -printf“ \ n” | wc -l
– godlygeek
15年3月3日在22:27
+1允许隐藏文件并忽略目录
–迈克尔·杜兰特(Michael Durrant)
2015年3月12日23:56
#3 楼
ls -1 | wc -l
...
$ ls --help | grep -- ' -1'
-1 list one file per line
...
$ wc --help | grep -- ' -l'
-l, --lines print the newline counts
PS :注意ls-<数字一> | wc-<字母-l>
评论
当输出到管道时,大多数版本的ls自动执行-1。
–丹尼斯·威廉姆森
2010年8月24日在1:01
@Dennis很有意思,我不知道一个应用程序可以告诉它输出到管道。
– xenoterracide
2010年8月24日5:35
我+推荐了这个版本,因为它更为明确。虽然,是的,如果通过管道将ls确实使用-1(请尝试:ls | cat),但我发现-1语法更加明确。
– Gabe。
10年8月24日在18:13
@xenoterracide:在Bash中:[[-p / dev / stdin]] && echo“ stdin来自管道”
–丹尼斯·威廉姆森
2010年8月25日在22:42
在我的测试中,提供-f选项可以避免ls对文件名进行排序,这明显要快得多。不幸的是,如果文件名包含换行符,您仍然会得到错误的答案。
–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
13年1月8日在20:42
#4 楼
如果要计数点文件,使用ls
/ wc
对的最完整答案可能是ls -Aq | wc -l
如果要计算点文件,请
ls -q | wc -l
否则。
-A
用于计数点文件,但省略.
和..
。-q
使ls
替换非图形字符,特别是换行符,带有?
,每个文件输出1行要从端子中的
ls
获得单行输出(即,不将其管道输送到wc
),必须添加-1
选项。 /> (
ls
的行为已通过coreutils 8.23测试)评论
如您所说,不需要-1。至于“它通过控制台输出明智地处理文件名中的换行符”,这是因为-q开关(由于它是可移植的,所以您应该使用它而不是-b,因为它强制每个不可打印文件名字符和
–don_crissti
15年5月13日在11:08
感谢您的输入。将-b更改为-q。
–传真机
2015年5月14日15:05
当前在文件计数中包含目录。为了最完整,我们需要一种简单的方法来在需要时省略这些内容。
–乔什·哈布达斯(Josh Habdas)
20年5月12日在7:48
@JoshHabdas它说“可能”。 ;)我认为省略目录的方法是使用don_crissti的建议,但要稍作改动:ls -qp | grep -vc /。实际上,您可以使用ls -q | grep -vc /计算所有(非隐藏)文件,添加-p使其仅匹配常规文件。
–传真机
20年5月12日,11:55
#5 楼
我发现du --inodes
有用,但是我不确定它需要哪个版本的du
。它应该比使用find
和wc
的替代方法快得多。在Ubuntu 17.10上,可以完成以下工作:
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
与
| sort -nr
结合使用按包含inode的数量降序排列。#6 楼
如果您知道当前目录至少包含一个非隐藏文件: set -- *; echo "$#"
此显然可以推广到任何glob。
在脚本中,这有时会覆盖位置参数,从而产生不幸的副作用。您可以通过使用subshell或使用类似Bourne / POSIX版本的函数来解决该问题,例如:
count_words () {
eval 'shift; '""'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
替代解决方案是
$(ls -d -- * | wc -l)
。如果glob为*
,则命令可以缩短为$(ls | wc -l)
。解析ls
的输出总是让我感到不安,但是在这里,只要您的文件名不包含换行符,或者您的ls
对其进行了转义,它就应该可以工作。并且$(ls -d -- * 2>/dev/null | wc -l)
的优点是可以很好地处理不匹配的glob的情况(即,在这种情况下它返回0,而set *
方法则需要仔细测试glob是否为空)。如果文件名可能包含换行符,或者使用
$(ls -d ./* | grep -c /)
。任何依赖于将glob的扩展传递给ls
的解决方案中的任何一个都可能失败,并且如果存在很多匹配文件。评论
您是否真的要创建13,923个位置参数?您应该将局部变量设为局部变量或将其消除:eval $ 1 = $#或仅使用echo $#并执行number_of_files = $(count_words *)。
–丹尼斯·威廉姆森
2010年8月24日,1:16
@丹尼斯:部分目的是避免分叉。我想这不是21世纪的问题。好的,我承认我不再关心非POSIX外壳程序了,因此我可以避免使用临时变量。
–吉尔斯'所以-不再是邪恶的'
2010年8月24日在7:14
为什么要从$#中减去一个(在编辑之前您没有这样做)?
–丹尼斯·威廉姆森
10年8月24日在22:12
@Dennis:我仍然避免使用fork(好吧,它确实在CPU速度较慢的计算机(例如路由器)上有所作为),并且将变量名传递为$ 1。因此,我要计算的不是第一个参数的参数数量。 (我不能使用shift,因为我需要保留变量名。)(嗯,现在,如果您询问第一行...)
–吉尔斯'所以-不再是邪恶的'
10年8月24日在22:42
@丹尼斯:想一想,如果时间合适,我可以使用shift。
–吉尔斯'所以-不再是邪恶的'
10年8月24日在22:50
#7 楼
在使用ls / wc对时,如果要添加-U,它将更快(不进行排序)。ls -AqU | wc -l
评论
-U是特定于GNU的。
–StéphaneChazelas
16 Mar 1 '16 at 16:25
#8 楼
安装tree命令后,只需键入:tree
如果您也想要隐藏文件:
tree -a
如果使用的是Debian / Mint / Ubuntu Linux,请键入以下命令以安装树命令:
sudo apt-get install tree
选项-L用于指定最大显示级别目录树。 tree命令不仅考虑文件的数量,还计算目录的数量,并根据需要选择尽可能多的目录树级别。
评论
键入tree时,我会在目录所在的屏幕上得到某种树输出,但看不到显示的文件数。
– charlesdarwin
18年4月25日在12:30
#9 楼
find -maxdepth 1 -type f -printf . | wc -c
-maxdepth 1
将使其为非递归的,find
默认为递归的-type f
将仅包含文件-printf .
很可爱。它为每个文件而不是文件名打印一个点,现在它可以处理任何文件名并保存数据。我们只需要计算点数即可:) | wc -c
计算字符数#10 楼
没有管道,没有字符串副本,没有叉子,只是普通的打击一个衬里 $ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
评论
如果目录中没有文件,则值为1。不计算文件,不计算文件和目录。
–steve
17年2月2日在21:42
#11 楼
这是与Gilles发布的方法类似的另一种技术:word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
创建具有13,923个元素的数组(如果有那么多文件)。
评论
该c数组的意义是什么? word_count(){echo“ $#”; }就足够了。 @Gilles解决方案的重点是将计数存储在返回的变量中,以避免必须使用命令替换(这涉及除ksh93之外的其他shell中的fork和pipe)。
–StéphaneChazelas
16年1月1日在16:27
#12 楼
find . -type f -maxdepth 1 | wc -l
只能列出当前目录中的文件。
评论
找 。 -type f将在当前目录以及子目录中递归查找文件。
– dhag
16年6月16日在20:23
#13 楼
在Linux上,要使命令非常健壮并处理名称中可能包含换行符的文件,请使用以下命令:find -maxdepth 1 -type f -print0 | tr -cd 'q4312078q' | wc -c
这使我们免于解析
ls
输出的麻烦。相关的内容:
计算文件中以nul分隔的项目
#14 楼
试试这个,希望这个答案对您有帮助echo $((`ls -l | wc -l` -1 ))
#15 楼
您可以使用以下方法进行检查:ls -l | grep -v ^l | wc -l
#16 楼
改善以前给出的答案,但是这次要明确地做。$ tree -L 1 | tail -n 1 | cut -d " " -f 3
值得注意的是使用了一些喜欢的命令,例如
tail
和cut
。 此外,请注意,默认情况下树不可用。上面的命令首先捕获有关级别1的目录的信息,然后获取目标行的最后一行
tail -n 1
,最后以cut
表示第三个单词。 例如,位于
/
中:/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
然后,询问目录数又如何呢?
#17 楼
如果您有权安装软件包,那么有一个非常简单的工具可以执行此操作(甚至更多)。它称为ncdu
,可以使用apt或yum安装。 ncdu的基本用法是:ncdu /path/to/dir
这将显示基于ncurses的屏幕,您可以使用光标键进行导航。在底部,最初您将看到该目录和子目录中的文件总数。使用向上/向下箭头键和ENTER键,您可以快速导航至任何目录并获得使用情况统计信息。
ncdu -x /path/to/dir
的使用略为先进,它将仅计算与该目录位于同一文件系统中的那些文件和目录正在被扫描。ncdu的一个好处是它在扫描时提供进度条。您还可以将输出重定向到文件以供以后使用。
在手册页中,有一个有趣的部分,介绍如何处理各种版本的ncdu的硬链接。
HTH。
#18 楼
使用tree
命令,只需:tree
评论
stackoverflow.com/questions/9157138/…树。 |尾巴或树-a。 |尾部包含隐藏的文件/目录,如果那是您想要的,则树是递归的。