我需要计算大量目录中的文件数。有一个简单的方法来使用shell脚本(使用find,wc,sed,awk或类似)吗?只是为了避免在python中编写正确的脚本。
输出将是这样的:
$ <magic_command>
dir1 2
dir2 12
dir3 5
目录名称后面的数字是文件数。加号可以打开和关闭点/隐藏文件的计数。
谢谢!
答案 0 :(得分:13)
尝试以下方法:
du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
答案 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'
<强>解释强>
答案 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