递归计算特定文件数量的BASH命令

8
我的目标是编写一个脚本,递归搜索当前工作目录及其子目录,并打印出普通文件数量、目录数量、块特殊文件数量、字符特殊文件数量、FIFO数量和符号链接数量。我必须使用[[ ]]条件测试。问题是我不知道如何开始。
我尝试了以下内容来搜索所有普通文件,但我不确定递归在BASH脚本中的确切工作方式:
function searchFiles(){
    if [[ -f /* ]]; then
        return 1
    fi
}
searchFiles
echo "Number of ordinary files $?"

但我得到的结果是0。有人能帮忙吗?

递归调用在哪里?为什么要使用递归?请注意,由于返回值受1字节(8位字节)的限制,您只能返回最大值255。 - phoxis
请查看 pushdpopd - phoxis
2个回答

42

为什么你不会使用find

$ # Files
$ find . -type f | wc -l
327
$ # Directories
$ find . -type d | wc -l
64
$ # Block special
$ find . -type b | wc -l
0
$ # Character special
$ find . -type c | wc -l
0
$ # named pipe
$ find . -type p | wc -l
0
$ # symlink
$ find . -type l | wc -l
0

我很想这样做,但我们被告知要特别使用这个条件。但我会尝试离开这个条件。 - jamesy
我们被告知要做某事,就像这是一个任务一样。 - Amanda
@阿曼达:这是一个任务 - 鉴于这已经过去一年了,我认为使用过去时态更合适。 - MattH
@MattH 我本来想跟你争辩的,但是...没错。现在确实是2012年。 - Amanda

3

以下是一些帮助您入门的内容:

#!/bin/bash

directory=0
file=0
total=0

for a in *
do
   if test -d $a; then
      directory=$(($directory+1))
   else
      file=$(($file+1))
   fi

   total=$(($total+1))
   echo $a

done

echo Total directories: $directory
echo Total files: $file
echo Total: $total

这里并没有递归,如果需要递归,可以使用ls -lR或类似命令;但是,如果你要使用外部程序,应该使用find来完成,因为它就是为此而设计的。


1
为递归使用**,需要打开shopt globstar(使用shopt -s globstar启用)。 - kon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接