각 디렉토리의 파일 수를 어떻게 계산합니까?
모든 디렉토리를 다음 순서로 나열할 수 있습니다.
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의 답변을 약간 수정하여find
du
합니다.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는 다음과 같이 입력합니다.$0
로sh
★★★★★★★★★★★★★★★★★」$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
'programing' 카테고리의 다른 글
파일을 일괄 정렬하는 방법 (0) | 2023.04.17 |
---|---|
변수에 값을 할당하는 한 줄씩 파일 줄 읽기 (0) | 2023.04.17 |
특정 열에 데이터가 포함된 마지막 행을 찾으려면 어떻게 해야 합니까? (0) | 2023.04.17 |
*nix의 ipython에서 vi 키를 사용하는 방법 (0) | 2023.04.17 |
WPF 차트 컨트롤 (0) | 2023.04.17 |