it-swarm.cn

如何使用命令行获取目录中文件的数量?

我的目录中包含大量文件。我看不到ls开关来提供计数。是否有一些命令行魔术来获取文件计数?

219
Blake

使用“文件”的广义定义

ls | wc -l

(请注意,它不计算隐藏文件,并假定文件名不包含换行符)。

为了包括隐藏文件(...除外)并避免换行符出现问题,规范的方法是:

find . ! -name . -Prune -print | grep -c /

或递归地:

find .//. ! -name . -print | grep -c //
279
James Roth

对于狭窄的文件定义:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
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-<number-one> | wc-<字母-l>

15
nicomen

我找到 du --inodes有用,但是我不确定它需要哪个版本的du。它应该比使用findwc的替代方法更快。

在Ubuntu 17.10上,以下工作正常:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

结合 | sort -nr按包含inode的数量降序排列。

12
krlmlr

使用ls // wc对的最完整答案可能是

ls -Aq | wc -l

如果您要计算点文件,并且

ls -q | wc -l

除此以外。

  • -A用于计数点文件,但省略...
  • -q使ls?替换非图形字符,特别是换行符,使每个文件输出1行

要从终端中的ls获得单行输出(即,不将其通过管道传递到wc),必须添加-1选项。

ls的行为已通过coreutils 8.23测试)

12
Frax

如果您知道当前目录至少包含一个非隐藏文件:

_set -- *; echo "$#"
_

显然,这可以推广到任何glob。

在脚本中,这有时会覆盖位置参数,从而产生不幸的副作用。您可以通过使用子外壳或使用类似以下功能(Bourne/POSIX版本)来解决此问题:

_count_words () {
  eval 'shift; '"$1"'=$#'
}
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 /)

如果有很多匹配文件,则这些依赖将全局扩展传递给ls的解决方案中的任何一个都可能因参数列表过长错误而失败。

8

当使用ls/wc对时,如果我们添加-U,它将更快(不进行排序)。

ls -AqU | wc -l
5
Jbnair

安装tree命令后,只需键入:

tree

如果您也想要隐藏文件:

tree -a

如果您使用的是Debian/Mint/Ubuntu Linux,请键入以下命令以安装tree命令:

Sudo apt-get install tree

选项-L用于指定目录树的最大显示级别。 tree命令不仅考虑文件的数量,还计算目录的数量,并根据需要选择任意数量的目录树。

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1将使其非递归,默认情况下find是递归的
  • -type f仅包含文件
  • -printf .是一种可爱的感觉。它为每个文件而不是文件名打印一个点,现在它可以处理任何文件名并保存数据。我们只需要数点:)
  • | wc -c计算字符
3
aude

没有管道,没有字符串副本,没有叉子,只是普通的打击一个衬里

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

在Linux上,要使命令非常健壮并处理名称中可能包含换行符的文件,请使用以下命令:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

这使我们免于解析ls输出的 ordeal


有关:

1
codeforester

这是另一种与 吉尔斯一贴 相似的技术:

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

这将创建一个包含13,923个元素的数组(如果那是有多少个文件)。

1
find . -type f -maxdepth 1 |  wc -l 

这只能列出当前目录中的文件。

1
srpatch

改进之前给出的答案,但是这次明确地做。

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

值得注意的是使用了一些喜欢的命令,例如tailcut。另外,请注意,默认情况下树不可用。上面的命令首先捕获有关级别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

然后,询问目录数又如何呢?

0
jonaprieto

试试这个,希望这个答案对您有帮助

echo $((`ls -l | wc -l` -1 ))
0
Tiger

您可以通过以下方式进行检查:

ls -l | grep -v ^l | wc -l
0
AMIC MING