使用递归方法在unix中的目录中进行文件计数

时间:2016-12-19 13:48:27

标签: bash function recursion hp-ux

问题陈述:列出目录中的文件数。 注意:目录可以包含子目录或文件,但不能同时包含两个子目录。 需要明确列出目录文件数。 这是一段代码。

#!/usr/bin/sh 
directory_navigate()
{   
    path=$1
    cd $path
    dir_count=`ls -l|grep '^d'|wc -l`
    if [ $dir_count -gt 0 ]
    then
        for dir in `ls`
        do
            sub_path="$path/$dir"
            directory_navigate $subpath
        done
    else    
        sub_path=`pwd`
        file_count $sub_path 
        return
    fi
}   

file_count ()
{
    path=$1
    cd $path
    count=`ls|wc -l`
    echo "Count of files in $path is $count"
    return
}

main()
{
    filepath=/var/prod/data/extract/tbill
    directory_navigate $filepath
    return 
}

main 

这会引发以下错误:递归过深

1 个答案:

答案 0 :(得分:2)

使用globstar。在bash

shopt -s globstar
count=0
for name in /basefolder/**
do
[ -f "$name" ] && (( count++ ))
done
echo "Total files : $count"

评论中建议的更简单的方法是

find /basefolder/ -type f -printfc | wc -c

在这里,我们不必解析(并且不解析,我们只想计算)文件,如果我们需要解析文件以获得更复杂的要求,那么下面是一些原因不使用find。

  • 使用find要求您需要对每个文件进行空分隔(即使用-print0)。
  • 此外,您需要使用while - read -r -d ' '组合来解析每个文件。
  • 总之,不值得努力。

修改:如果您想要一个目录明确的文件计数列表,请执行以下操作

#!/bin/bash
shopt -s globstar
for name in ~/Documents/so/**
do
if [ -d "$name" ]
then
  count="$(find "$name" -type f -printf c | wc -c)"
  echo "Total files in $name : $count"
fi
done