10

我需要计算大量目录上的文件数。有没有一种简单的方法可以使用 shell 脚本(使用 find、wc、sed、awk 或类似的)来做到这一点?只是为了避免必须在 python 中编写适当的脚本。

输出将是这样的:

$ <magic_command>
dir1  2
dir2 12
dir3  5

目录名称后面的数字将是文件的数量。一个加号将能够打开和关闭点/隐藏文件的计数。

谢谢!

4

11 回答 11

14

试试下面的一个:

du -a | cut -d/ -f2 | sort | uniq -c | sort -nr

来自http://www.linuxquestions.org/questions/linux-newbie-8/how-to-find-the-total-number-of-files-in-a-folder-510009/#post3466477

于 2012-12-07T06:19:40.870 回答
6
find <dir> -type f | wc -l

find -type f将在每一行列出指定目录中的所有文件,wc -l计算从标准输入中看到的换行符的数量。

也供将来参考:像这样的答案是谷歌。

于 2012-12-07T06:17:00.190 回答
4

或多或少我在寻找什么:

find . -type d -exec sh -c 'echo "{}" `ls "{}" |wc -l`' \;
于 2012-12-07T06:31:47.670 回答
3

尝试 ls | wc列出您目录中的文件并将文件输出列表作为输入提供给 wc

于 2012-12-07T06:16:44.980 回答
3

像这样的一种方式:

$ for dir in $(find . -type d  )
> do
>  echo $dir $(ls -A $dir | wc -l )
> done

如果您不希望隐藏文件计数,只需删除 -A 选项

于 2012-12-07T06:29:21.307 回答
1
find . -type d | xargs ls -1 | perl -lne 'if(/^\./ || eof){print $a." ".$count;$a=$_;$count=-1}else{$count++}'

下面是测试:

> find . -type d
.
./SunWS_cache
./wicked
./wicked/segvhandler
./test
./test/test2
./test/tempdir.
./signal_handlers
./signal_handlers/part2
> find . -type d | xargs ls -1 | perl -lne 'if(/^\./ || eof){print $a." ".$count;$a=$_;$count=-1}else{$count++}'

.: 79
./SunWS_cache: 4
./signal_handlers: 6
./signal_handlers/part2: 5
./test: 6
./test/tempdir.: 0
./test/test2: 0
./wicked: 4
./wicked/segvhandler: 9
于 2012-12-07T07:20:44.170 回答
1

Mehdi Karamosly 解决方案的通用版本,用于在不更改当前目录的情况下列出任何目录的文件夹

DIR=~/test/ sh -c 'cd $DIR; du -a | cut -d/ -f2 | sort | uniq -c | sort -nr'

解释:

  1. 将目录提取到变量中
  2. 启动新外壳
  3. 更改该 shell 中的目录,以便当前 shell 的目录保持不变
  4. 过程
于 2016-12-29T12:32:21.330 回答
0

我使用这些功能:

nf()(for d;do echo $(ls -A -- "$d"|wc -l) "$d";done)
nfr()(for d;do echo $(find "$d" -mindepth 1|wc -l) "$d";done)

两者都假设文件名不包含换行符。

这是仅限 bash 的版本:

nf()(shopt -s nullglob dotglob;for d;do a=("$d"/*);echo "${#a[@]} $d";done)
nfr()(shopt -s nullglob dotglob globstar;for d;do a=("$d"/**);echo "${#a[@]} $d";done)
于 2015-06-15T15:08:43.307 回答
0

我喜欢基于 du 的答案的输出,但是当我查看大型文件系统时,它需要很长时间,所以我整理了一个基于 ls 的小脚本,它提供了相同的输出,但速度更快:

for dir in `ls -1A ~/test/`;
do
  echo "$dir `ls -R1Ap ~/test/$dir | grep -Ev "[/:]|^\s*$" | wc -l`"
done
于 2016-05-21T13:41:32.540 回答
0

您可以尝试将 ls 命令的输出复制到文本文件中,然后计算该文件中的行数。

ls $LOCATION > outText.txt; NUM_FILES=$(wc -w outText.txt); echo $NUM_FILES

于 2018-05-10T19:10:21.983 回答
-1

find -type f -printf '%h\n' | sort | uniq -c | sort -n

于 2016-12-29T14:05:54.393 回答