디렉토리 트리 리프에 있는 파일 수 계산

디렉토리 트리 리프에 있는 파일 수 계산

각 하위 디렉터리의 파일 수를 계산하기 위해 다음 코드 조각을 생각해냈습니다.

for x (**/*(/)); do print $x; find $x -maxdepth 1 -type f | wc -l; done

이 명령은 아래와 같이 연속된 쌍(아래 한 쌍)을 출력합니다.

directory_name
# of files

위의 코드를 다음과 같이 변경하고 싶습니다.

  • 같은 줄에 각 일치 항목을 인쇄합니다(예: directory_name ':' # of files).
  • 파일은 폴더가 디렉터리 트리에 있는 경우(즉, 하위 폴더가 없는 경우)에만 계산됩니다.

어떻게 해야 하나요?

답변1

이 시도:

for dir in $( gfind . -type d -print ); do files=$( find $dir -maxdepth 1 -type f | wc -l ); echo "$dir : $files"; done

또는 스크립트에서 더 많은 유연성을 가질 수 있습니다.

#!/usr/bin/ksh

# pass in the directory to search on the command line, use $PWD if not arg received
rdir=${1:-$(pwd)}

# if $rdir is a file, get it's directory
if [ -f $rdir ]; then
    rdir=$(dirname $rdir)
fi

# first, find our tree of directories
for dir in $( gfind $rdir -type d -print ); do
    # get a count of directories within $dir.
    sdirs=$( find $dir -maxdepth 1 -type d | wc -l );
    # only proceed if sdirs is less than 2 ( 1 = self ).
    if (( $sdirs < 2 )); then 
        # get a count of all the files in $dir, but not in subdirs of $dir)
        files=$( find $dir -maxdepth 1 -type f | wc -l ); 
        echo "$dir : $files"; 
    fi
done

#!/usr/bin/zshksh를 쉘 스크립트로 사용하고 있지만 , 또는 에서도 잘 작동합니다 /usr/bin/bash.

답변2

빠르고 더러운

find . -type d | \
while IFS= read -r d; do
    f=$(ls -F "$d");
    echo "$f" | egrep -q "/$" || \
        echo $d : $(echo -n "$f"|wc -l) files;
done

관련 정보