2016-12-19 11 views

답변

2

사용 globstar 너무 깊이 :

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

이 다음과 같은 오류가 발생합니다. bash에서 주석에 제안보다 간단한 방법은 여기

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

입니다

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

을, 캐치는 우리가, 우리가 계산하려는 구문 분석 할 필요가 없습니다 (과 해석을하지 않는 것입니다) 더 복잡한 요구 사항을 위해 파일을 구문 분석해야하는 경우 파일을 찾으면 다음과 같은 이유로 find를 사용하지 않을 수 있습니다.

  • find를 사용하려면 각 파일을 null로 구분해야합니다 (예 : -print0 사용).
  • 또한 각 파일을 구문 분석하려면 while - read -r -d ' ' 조합을 사용해야합니다.
  • 요약하자면, 그만한 가치는 없습니다.

편집 : 당신이 디렉토리 현명한 파일 카운트 목록을 가지고 싶다면은 무엇 단지`find` 사용에 대한

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

참고로 globstar는 bash 4.0 이후에만 사용 가능합니다. Mac OS와 같은 일부 OS는 기본적으로이 OS가 없으므로 쉘을 업그레이드해야합니다. – Aserre

+0

@Aserre : 좋은 점, 이것을 알고 있습니다. Op는'unix '를 언급했기 때문에 bash 버전이 4.0 이상이기를 바랍니다. 4.03 – sjsam

+0

MacOS는 유닉스 기반입니다 :) – Aserre