用于计算每个目录中文件数的脚本

时间:2012-12-07 06:13:25

标签: shell

我需要计算大量目录中的文件数。有一个简单的方法来使用shell脚本(使用find,wc,sed,awk或类似)吗?只是为了避免在python中编写正确的脚本。

输出将是这样的:

$ <magic_command>
dir1  2
dir2 12
dir3  5

目录名称后面的数字是文件数。加号可以打开和关闭点/隐藏文件的计数。

谢谢!

11 个答案:

答案 0 :(得分:13)

答案 1 :(得分:6)

find <dir> -type f | wc -l

find -type f 将列出指定目录中每行的所有文件, wc -l <​​/ em>计算从stdin看到的换行数量。

同样供将来参考:像这样的答案是google之远。

答案 2 :(得分:4)

或多或少我正在寻找的东西:

find . -type d -exec sh -c 'echo "{}" `ls "{}" |wc -l`' \;

答案 3 :(得分:3)

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

答案 4 :(得分:3)

这样的一种方式:

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

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

答案 5 :(得分: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

答案 6 :(得分:1)

Mehdi Karamosly解决方案的通用版 列出任何目录的文件夹而不更改当前目录

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

<强>解释

  1. 将目录解压缩到变量
  2. 启动新shell
  3. 更改该shell中的目录,以便当前shell的目录保持不变
  4. 过程

答案 7 :(得分:0)

I use these functions:

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)

Both assume that filenames don't contain newlines.

Here's bash-only versions:

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)

答案 8 :(得分:0)

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

for dir in `ls -1A ~/test/`;
do
  echo "$dir `ls -R1Ap ~/test/$dir | grep -Ev "[/:]|^\s*$" | wc -l`"
done

答案 9 :(得分:0)

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

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

答案 10 :(得分:-1)

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