여러 디렉터리의 파일 수를 재귀적으로 계산하는 방법은 무엇입니까?

여러 디렉터리의 파일 수를 재귀적으로 계산하는 방법은 무엇입니까?

많은 파일과 디렉토리가 있는 디렉토리가 있습니다.

각 디렉터리에 반복적으로 포함된 파일(및 디렉터리) 수를 얻으려고 합니다.

나는 다음을 시도했다:

for dir in $(find -maxdepth 1 -type d); do echo "$dir"; echo find "$dir" | wc -l; done

그러나 이는 각 디렉터리에 대한 결과로 "1"을 반환합니다.

비슷한 문제가 있는 다른 질문이 여러 개 있다는 것을 알고 있지만 위 코드에서 내 오류가 무엇인지 알고 싶습니다.

답변1

GNU( bash, wcfind) 솔루션모든 경로에서 작동, 공백, 줄 바꿈 또는 대시로 시작하는 모든 항목이 포함된 경우에도 마찬가지입니다.

shopt -s nullglob
for dir in ./*/
do
    printf '%s\n' "$dir"
    find "$dir" -mindepth 1 -printf x | wc --chars
done

설명하다:

  • nullglob이 옵션은 디렉토리가 포함되지 않은 경우 오류를 방지합니다../
  • ./디렉토리의 Globs는 대시(" ")로 시작하는 파일 이름이 -왜곡 echo되거나 find.
  • glob 끝에 있는 슬래시는 디렉터리만 처리되도록 합니다.
  • -mindepth 1디렉터리 자체를 계산하지 마세요.
  • 점으로 시작하는 최상위 디렉토리를 포함하려면 루프 shopt -s dotglob전에 실행 해야 합니다 for.

답변2

이것은 bash4+의 또 다른 방법입니다. 이는 심볼릭 링크를 따르며 l0b0의 답변을 포함하지 않으며 .이와 ..다릅니다(원하는 것일 수도 있고 아닐 수도 있음).

(
    shopt -s dotglob globstar nullglob
    for dir in */; do
        set -- "$dir"/**/*
        printf '%s: %d\n' "$dir" "$#"
    done
)

답변3

$(find -maxdepth 1 -type d)현재 디렉토리의 디렉토리 목록을 출력합니다. 이름이 로 시작하는 디렉토리가 없으면 .작성하는 방법이 복잡합니다 */. 또한 신뢰할 수 없습니다. 디렉터리 이름에 공백이나 와일드카드가 포함되어 있지 않은 경우에만 작동합니다 \[?*. 이는 $(…)공백 문자가 있을 때마다 명령 대체 결과가 별도의 단어로 분할되고 각 단어가 glob(파일 이름 와일드카드 패턴)으로 해석되기 때문입니다 . 명령 대체를 큰따옴표( "$()")로 묶어 이 동작을 방지할 수 있지만 루프에 의해 반복되는 목록에는 줄 바꿈으로 구분된 디렉터리 이름을 연결한 단일 요소가 포함됩니다.

다음 쉘 프로그래밍 규칙에 유의하세요.변수 대체 및 명령 대체에는 항상 큰따옴표를 사용하세요.( "$foo", "$(foo)") 큰따옴표를 생략해야 한다는 것을 모르는 경우그리고당신은 그들을 내버려 두는 것이 얼마나 안전한지 알고 있습니다.

스크립트의 또 다른 문제점은 간단합니다. echo find "$dir"항상 의도한 대로 한 줄을 인쇄합니다 find "$dir".

for dir in */; do
  echo "$dir"
  find "$dir" | wc -l
done

이는 트리에 개행 문자가 포함된 파일이 없는 경우에만 작동합니다. 가능하다면 find명령이 신뢰할 수 있는 내용을 인쇄하도록 할 수 있습니다. GNU 찾기 사용(즉, 내장되지 않은 Linux 또는 Cygwin에서):

for dir in */; do
  echo "$dir"
  find "$dir" -printf a | wc -c
done

가지고 다닐 수 있는:

for dir in */; do
  echo "$dir"
  find "$dir" -exec printf %c {} + | wc -c
done

답변4

GNU Parallel을 사용하면 다음과 같습니다:

parallel -0 --tag  'find {} |wc -l' ::: */

find|wcCPU당 하나씩 병렬로 실행 됩니다 . 스토리지 시스템에 따라 병렬화로 인해 속도가 증가하거나 감소할 수 있습니다. 이를 알 수 있는 유일한 방법은 테스트하는 것입니다. 프로세스 수는 를 통해 조정할 수 있습니다 -j.

GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다.

4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.

간단한 스케줄링

대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.

GNU 병렬 스케줄링

설치하다

배포판에 GNU Parallel이 패키지되어 있지 않으면 루트 액세스 없이 개인 설치를 수행할 수 있습니다. 이 작업은 10초 안에 완료할 수 있습니다.

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README

더 알아보기

더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html

소개 비디오 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

이 튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html

지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel

관련 정보