【问题标题】:File count within directories in unix using recursive approach使用递归方法的unix目录中的文件计数
【发布时间】:2016-12-19 13:48:26
【问题描述】:

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

#!/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 

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

【问题讨论】:

  • 只使用find怎么样?

标签: bash function recursion count hp-ux


【解决方案1】:

使用 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 需要对每个文件进行空分隔(即使用 -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

【讨论】:

  • 附带说明,globstar 仅从 bash 4.0 开始可用。某些操作系统(如 MacOS)默认情况下没有它,需要升级它们的 shell。
  • @Aserre :很好,我知道这一点。该操作提到了有问题的unix,所以希望他的bash版本> 4.0
  • MacOS 是基于 Unix 的 :)
  • 使用find . -type f -printf c | wc -c怎么样?不需要太多的努力
  • @user000001 :对不起,我忽略了您评论中的-printf c。是的,它做了它应该做的事情.. :)
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2021-09-09
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多