디렉토리 트리의 파일 수 계산

디렉토리 트리의 파일 수 계산

백업 프로그램의 일관성 검사를 위해 하위 디렉터리, 하위 하위 디렉터리 등의 모든 파일을 포함하여 디렉터리의 모든 파일을 계산하는 기능을 정의하고 싶습니다.

지금까지 시도한 솔루션은 다음과 같습니다.

countfiles() {
  local cdir=$1
  local files=$(ls -la $cdir | grep -cv '^[dl]')

  local dirstring=$(ls -la $cdir | grep '^d' | egrep -o ' \.?[^[:space:].][^[:space:]]+$')
  local directories=(${dirstring//"\n"/})

  echo ${directories[@]}


  for dir in ${directories[@]}; do
    echo -n "$dir "
    echo -n 'filecount >> '
    local dirfiles=$(countfiles "$cdir/$dir")
    echo -n $dirfiles
    echo ' <<'
    #files=$(($files+$dirfiles))
  done

  echo $files

}

그러면 다음과 같은 결과가 나옵니다.

.config .i3 .scripts
.config filecount >> gtk-3.0 termite gtk-3.0 filecount >> 2 << termite filecount >> 2 << 1 <<
.i3 filecount >> 5 <<
.scripts filecount >> 2 <<
5

내 카운터의 구현에는 $filesatm이라는 주석이 달려 있어 지역화를 해제해야 할 수도 있지만 지금은 간섭을 피하기 위해 모든 변수를 로컬로 만듭니다.

디렉토리 트리는 다음과 같습니다.

/.scripts/backup_dotfiles.sh
/.config/termite/config
/.config/gtk-3.0/settings.ini
/.i3/config
/.i3/i3blocks.conf
/.i3/lockicon.png
/.i3/lockscreen.sh
/.gtkrc-2.0
/.bashrc
/.zshrc
/.i3
/.Xresources

내 질문:

  • 홈 디렉터리 외부의 파일은 왜 항상 +1인가요?
  • ".config" 디렉터리에 파일이 없는데 왜 그 디렉터리에 있는 내용을 계산합니까?
  • 이 문제를 어떻게 해결할 수 있나요?

답변1

find파일 이름에 개행 문자가 없다고 가정하면 다음을 수행하십시오 .

find "$dir" -type f | wc -l

-type f일반 파일과 일치하지만 디렉터리, 파이프, 소켓 등과는 일치하지 않습니다.

일반적인 출력에서는 find파일 이름을 개행 문자로 구분하므로 이름에 개행 문자가 포함되어 있으면 출력이 모호해집니다. GNU find를 사용하면 다음과 같이 작동합니다.

find "$dir" -type f -printf . | wc -c

파일당 하나의 포인트만 인쇄 find하고 포인트 수를 계산합니다.

다른 버전에서는 find그렇지 않지만 -printf이중 슬래시를 사용하여 입력 경로를 전달하는 트릭을 사용할 수 있습니다. 단일 슬래시로 처리되지만 파일 이름에는 슬래시가 포함될 수 없으므로 출력에 자연스럽게 표시되지 않습니다. 그런 다음 출력에서 ​​이중 슬래시 수를 계산합니다.

find "$dir//" -type -f | grep -c //

순전히 쉘 스크립트를 사용하여 이 작업을 수행하려면 쉘에 파일 이름을 나열하도록 요청할 수 있습니다.사용할 필요가 없습니다ls, 예를 들어 Bash에서는 다음과 같습니다.

#!/bin/bash
files=0
shopt -s dotglob
countfiles() {
        local f;
        for f in * ; do 
                if [ -f "$f" ] ; then          # count regular files
                        files=$((files + 1))
                elif [ -d "$f" ] ; then        # recurse into directories
                        cd "$f"
                        countfiles
                        cd ..
                fi
        done
}
cd "$1"
countfiles
echo $files

답변2

다음 명령을 사용하여 디렉터리 및 하위 디렉터리의 파일 수를 얻을 수 있습니다.

 find path_to_directory -type f | wc -l

답변3

홈 디렉터리 외부의 파일은 왜 항상 +1인가요?

ls -la도 total 20출력에 문자열을 추가하기 때문입니다. "마스터" 디렉터리에 대해서도 +1 값이 표시되는 것을 볼 수 있습니다.

".config" 디렉터리에 파일이 없는데 왜 그 디렉터리에 있는 내용을 계산합니까?

같은 이유. total ..결과 문자열 ls.

이 문제를 어떻게 해결할 수 있나요?

스크립트를 사용하지 마세요 :) 내 말은, 정말 너무 복잡하다는 뜻입니다. 우리는 find여기서 즐거운 시간을 보냅니다. 모든 스크립트는 다음과 같습니다(디렉토리당 파일이 필요한 경우).

find $yourdir -type d | while read dir ; do 
    echo "$dir == $(find $dir -maxdepth 1 -type f | wc -l) files" ; 
done

아니면 그냥 (합계 값이 필요한 경우):

find $yourdir -type f | wc -l

관련 정보