programing

각 디렉토리의 파일 수를 어떻게 계산합니까?

starjava 2023. 4. 17. 21:13
반응형

각 디렉토리의 파일 수를 어떻게 계산합니까?

모든 디렉토리를 다음 순서로 나열할 수 있습니다.

find ./ -type d

다음 명령을 사용하여 각 디렉토리의 내용을 나열하고 각 디렉토리의 파일 수를 세려고 했습니다.

find ./ -type d | xargs ls -l | wc -l

그러나 이것은 에 의해 반환된 총 회선 수를 합산한 것입니다.

find ./ -type d | xargs ls -l

각 디렉토리에 있는 파일 수를 셀 수 있는 방법이 있나요?

현재 디렉토리 레벨의 디렉토리별 파일수가 출력됩니다.

du -a | cut -d/ -f2 | sort | uniq -c | sort -nr

GNU find가 있다고 가정하면 디렉토리가 검색되고 bash가 나머지 작업을 수행합니다.

find . -type d -print0 | while read -d '' -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
find . -type f | cut -d/ -f2 | sort | uniq -c
  • find . -type f file 및 에는 "이러한 폴더"가 있습니다.
  • cut -d/ -f2
  • sort
  • uniq -c

모든 파일을 검색하여 파일 이름을 삭제하고 각 파일의 디렉토리 이름만 포함하는 행을 남긴 후 각 디렉토리가 나타나는 횟수를 셀 수 있습니다.

find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c

여기서 유일한 getcha는 파일 이름 또는 디렉토리 이름에 줄 바꿈 문자가 포함되어 있는 경우입니다.이는 거의 발생하지 않습니다.파일명이나 디렉토리명의 줄바꿈에 대해 정말로 걱정해야 하는 경우, 그것들을 찾아 줄바꿈을 하지 않도록 수정하는 것이 좋습니다(그리고 그 방법의 오류를 피해자에게 조용히 설득하는 것이 좋습니다).


각이 있는 서브디렉토리의 sed최상위 디렉토리만 인쇄하려면 다음 명령을 사용합니다.

find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c

첫 번째 패턴은 이름의 시작 부분, 점, 슬래시, 다음 슬래시 및 슬래시까지의 이름을 캡처하고 행을 첫 번째 부분으로 바꿉니다.이렇게 하면 다음과 같습니다.

./dir1/dir2/file1

에 의해 대체됩니다.

./dir1/

, 이은 ""로 됩니다.파일의 말미에 슬래시가 없고, 다음과 같이 치환됩니다../가 작동합니다. 그러면 이름 수만큼 정렬 및 카운트가 작동합니다.

여기 한 가지 방법이 있지만 가장 효율적인 방법은 아닐 수 있습니다.

find -type d -print0 | xargs -0 -n1 bash -c 'echo -n "$1:"; ls -1 "$1" | wc -l' --

다음과 같은 출력과 디렉토리 이름 뒤에 해당 디렉토리의 엔트리 수가 표시됩니다.출력 카운트에는, 필요한 디렉토리 엔트리가 포함되어 있지 않은 경우도 있습니다.

./c/fa/l:0
./a:4
./a/c:0
./a/a:1
./a/a/b:0

Sebastian의 답변을 약간 수정하여finddu합니다.du를 실행할 필요가 있지만, 그것은 사용되지 않습니다).

 find ./ -mindepth 2 -type f | cut -d/ -f2 | sort | uniq -c | sort -nr

-mindepth 2파라미터는 현재 디렉토리의 파일을 제외하기 위해 사용됩니다.삭제하면, 다음과 같은 행이 다수 표시됩니다.

  234 dir1
  123 dir2
    1 file1
    1 file2
    1 file3
      ...
    1 fileN

처럼)du doesbased variant does)-based var

현재 디렉토리내의 파일도 카운트 할 필요가 있는 경우는, 다음의 확장 버전을 사용합니다.

{ find ./ -mindepth 2 -type f | cut -d/ -f2 | sort && find ./ -maxdepth 1 -type f | cut -d/ -f1; } | uniq -c | sort -nr

출력은 다음과 같습니다.

  234 dir1
  123 dir2
   42 .

다른 모든 사람의 해결책에는 이런저런 단점이 있다.

find -type d -readable -exec sh -c 'printf "%s " "$1"; ls -1UA "$1" | wc -l' sh {} ';'

설명:

  • -type d이치노
  • -readable: 파일 목록이 가능한 경우에만 파일을 원합니다.주의:find 그 에서 그 의 디렉토리를 , 시키지만, , 「디렉토리」, 「디렉토리」의 콜이 됩니다.-exec그들을 위해.
  • -exec sh -c BLAH sh {} ';'각, 를 실행합니다.이 스크립트 fragment는 다음과 같이 입력합니다.$0sh ★★★★★★★★★★★★★★★★★」$1파일명으로 설정합니다.
  • printf "%s " "$1":디렉토리명을포터블하고최소한으로인쇄합니다.그 뒤에 공백만 있고 줄바꿈은 없습니다.
  • ls -1UA: 특수 디렉토리만 제외하고 (파이프의 지연을 피하기 위해) 파일을 1줄에 1개씩 디렉토리 순서로 나열합니다.. ★★★★★★★★★★★★★★★★★」..
  • wc -l: " " "

이것은 find 대신 ls를 통한 루프에서도 실행할 수 있습니다.

for f in */; do echo "$f -> $(ls $f | wc -l)"; done

설명:

for f in */;. - 모든 디렉토리를 루프합니다.

do echo "$f ->각합니다. - 디렉토리 이름을 출력합니다.

$(ls $f | wc -l)이 카운트에 를 실행합니다.

디렉토리명과 디렉토리내의 파일수가 차례로 반환됩니다.

findfiles() {
    echo "$1" $(find "$1" -maxdepth 1 -type f | wc -l)
}

export -f findfiles

find ./ -type d -exec bash -c 'findfiles "$0"' {} \;

출력 예:

./ 6
./foo 1
./foo/bar 2
./foo/bar/bazzz 0
./foo/bar/baz 4
./src 4

export -f인 것은 '''가 하기 때문입니다.-exec가 됩니다.find는 bash를 명시적으로 호출하지 않는 한 bash 함수를 실행할 수 없으며 현재 스코프에서 정의된 함수를 새 셸로 명시적으로 내보내야 합니다.

제 대답은 조금 다릅니다.찾기 옵션이 있기 때문에 훨씬 더 유연해질 수 있습니다.시험해 보세요:

find . -type f -printf "%h\n" | sort | uniq -c

"%h" 옵션을 "-printf"로 설정하면 찾은 파일의 디렉터리만 인쇄됩니다.그런 다음 "uniq -c"로 정렬하고 카운트합니다.디렉토리당 같은 디렉토리를 가지는 검색 결과 엔트리의 수가 인쇄됩니다.

검색 시 추가 옵션을 사용하면 훨씬 더 유연하게 작업할 수 있습니다.예를 들어, 특정 날짜에 변경된 디렉터리의 파일 수를 개괄적으로 보려면 다음을 사용합니다.

find . -newermt "2022-01-01 00:00:00" -type f -printf "%TY-%Tm-%Td %h\n" | sort | uniq -c

2022년 1월 이후 수정된 모든 파일을 찾아 수정 날짜와 디렉토리를 인쇄(-printf)한 후 정렬하고 카운트합니다.이 예에서는 결과의 각 행에 파일 수, 변경 날짜(시간 없음) 및 디렉토리가 있습니다.

"-printf"는 일부 버전의 find에서는 사용할 수 없는 경우가 있습니다.

@glenn jackman의 답변과 @pcarvalho의 답변을 조합했습니다(댓글리스트에서 pcarvalho의 답변은 캐릭터 '(backtick)'의 추가 스타일 컨트롤 기능이 있기 때문에 문제가 있습니다).

스크립트는 경로를 증분으로 받아들이고 디렉토리 목록을 다음과 같이 정렬할 수 있습니다.ls -l파일명의 스페이스」의 문제도 처리할 수 있습니다.

#!/bin/bash
OLD_IFS="$IFS"
IFS=$'\n'
for dir in $(find $1 -maxdepth 1 -type d | sort); 
do
    files=("$dir"/*)
    printf "%5d,%s\n" "${#files[@]}" "$dir"
done
FS="$OLD_IFS"

stackoverflow의 첫 번째 답변으로 누군가에게 도움이 되었으면 합니다^_^

이것은 디렉토리 구조를 참조해, 상세 결과를 제공하는 또 다른 방법이 될 수 있습니다.

find . -type d  | awk '{print "echo -n \""$0"  \";ls -l "$0" | grep -v total | wc -l" }' | sh 

find . - type f - printf %h \ n | sort | uniq - c

는 예를 들어 다음과 같습니다.

  5 .
  4 ./aln
  5 ./aln/iq
  4 ./bs
  4 ./ft
  6 ./hot

여기 있는 다른 일부와 함께 시도했지만 파일만 원하는 경우 파일 수에 하위 폴더가 포함되었습니다.이 인쇄물은./folder/path<tab>nnn현재 폴더의 각 하위 폴더에 대한 파일 수(하위 폴더 제외)를 지정합니다.

for d in `find . -type d -print` 
do 
  echo -e "$d\t$(find $d -maxdepth 1 -type f -print | wc -l)"
done

이렇게 하면 전체 카운트가 표시됩니다.

for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'

파일을 재귀적으로 통과하여 디렉토리 내의 이미지 수를 카운트하고 이미지 확장자별로 출력을 정리하는 초고속 기적 명령어입니다.

find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'

크레딧 : https://unix.stackexchange.com/a/386135/354980

것을 했습니다.node_modules분석된 디렉토리 내의 디렉토리.

프로젝트 파일 수가 파일 감시자가 처리할 수 있는 최대 수를 초과하는지 확인할 수 있습니다.

find . -type d ! -path "*node_modules*" -print0 | while read -d '' -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done

시스템에서 볼 수 있는 최대 파일을 확인하려면:

cat /proc/sys/fs/inotify/max_user_watches

node_modules폴더는 느린 시스템에서는 IDE/에디터 제외 경로에 추가해야 하며, 다른 파일 수는 최대값을 초과해서는 안 됩니다(단, 변경할 수 있습니다).

간단한 방법:

./|grep "Search_file.txt" |cut -d"/" -f2|sort |uniq -c

내 경우 하위 폴더 수준에서 카운트가 필요했기 때문에 다음을 수행했습니다.

du -a | cut -d/ -f3 | sort | uniq -c | sort -nr

특정 유형의 파일을 재귀적으로 쉽게 찾을 수 있습니다.이 경우 현재 디렉토리의 모든 폴더에 대한 .jpg 파일:

find . -name *.jpg -print | wc -l

omg 복잡한 명령어 이유같은 것을 사용하다

find whatever_folder | wc -l

언급URL : https://stackoverflow.com/questions/15216370/how-to-count-number-of-files-in-each-directory

반응형