모든 디렉토리를 다음과 같이 나열 할 수 있습니다.
find ./ -type d
다음 명령을 사용하여 각 디렉터리의 내용을 나열하고 각 디렉터리의 파일 수를 계산하려고했습니다.
find ./ -type d | xargs ls -l | wc -l
그러나 이것은 반환 된 총 줄 수를 합산했습니다.
find ./ -type d | xargs ls -l
각 디렉토리의 파일 수를 계산할 수있는 방법이 있습니까?
모든 디렉토리를 다음과 같이 나열 할 수 있습니다.
find ./ -type d
다음 명령을 사용하여 각 디렉터리의 내용을 나열하고 각 디렉터리의 파일 수를 계산하려고했습니다.
find ./ -type d | xargs ls -l | wc -l
그러나 이것은 반환 된 총 줄 수를 합산했습니다.
find ./ -type d | xargs ls -l
각 디렉토리의 파일 수를 계산할 수있는 방법이 있습니까?
답변:
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 . -maxdepth 1 -type d | sort
; 할 y = find $x | wc -l
; echo $ x, $ y; 완료
find . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
공백이있는 dir 이름을 올바르게 처리하려면 첫 번째 주석의 따옴표 안에 있어야합니다. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
현재 디렉터리 수준에 대한 디렉터리 당 파일 수를 인쇄합니다.
du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. | sort -nr
디렉토리 이름 대신 개수별로 정렬하려면 추가하십시오 .
find . -type f | cut -d/ -f2 | sort | uniq -c
find. -type f
유형 파일의 모든 항목을 찾으려면cut -d/ -f2
특정 폴더를 잘라내려면sort
폴더 이름 목록을 정렬하려면uniq -c
각 폴더 이름이 계산 된 횟수를 반환합니다.find . -type f | cut -d/ -f2,3 | sort | uniq -c
모든 파일을 찾고, 파일 이름을 제거하고, 각 파일의 디렉토리 이름 만 포함 된 행을 남겨두고, 각 디렉토리가 나타나는 횟수를 세도록 정렬 할 수 있습니다.
find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c
유일한 문제는 개행 문자를 포함하는 파일 이름이나 디렉토리 이름이있는 경우입니다. 파일 이름이나 디렉토리 이름에서 줄 바꿈에 대해 정말로 걱정해야한다면, 그들을 찾아서 수정하여 줄 바꿈을 포함하지 않도록 수정하십시오 (그리고 그들의 방식에 오류가 있다는 죄인을 조용히 설득).
현재 디렉터리의 각 하위 디렉터리에있는 파일 수에 관심이 있고 하위 디렉터리의 모든 파일과 직접 하위 디렉터리에있는 파일을 계산하는 데 관심이 있다면 sed
명령을 인쇄 전용으로 조정합니다. 최상위 디렉토리 :
find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c
첫 번째 패턴은 이름의 시작, 점, 슬래시, 다음 슬래시까지의 이름 및 슬래시를 캡처하고 행을 첫 번째 부분으로 만 바꿉니다.
./dir1/dir2/file1
대체된다
./dir1/
두 번째 교체는 현재 디렉토리에서 직접 파일을 캡처합니다. 끝에 슬래시가 없으며 ./
. 그런 다음 정렬 및 개수는 이름 수에만 적용됩니다.
find
. 일부는 다음과 같습니다. 파일 dir1/dir2/dir3/file1
이 있지만 dir1/dir2
하위 디렉토리 만 포함 (일반 파일 없음)하면 해당 존재를 유추 할 수 있습니다. 그러나 dir1/dir4
파일이 없으면 이름이 표시되지 않습니다.
여기에 한 가지 방법이 있지만 아마도 가장 효율적인 방법은 아닙니다.
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
bash
, ls
, wc
에 의해 발견 된 각 디렉토리를) find
.
man bash
, A -- signals the end of options and disables further option processing
. 이 경우, 찾기의 일부로 발견 된 이름이 잘못된 파일이 bash에 대한 인수 처리의 일부가되는 것을 방지합니다.
다른 모든 사람의 솔루션에는 한 가지 단점이 있습니다.
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 {} ';'
각 디렉토리와,이 스크립트 조각을 실행 $0
으로 설정 sh
하고 $1
파일 이름으로 설정합니다.printf "%s " "$1"
: 디렉토리 이름을 이식 가능하고 최소한으로 인쇄하고 그 뒤에 개행이 아닌 공백 만 표시합니다.ls -1UA
: 파일을 한 줄에 하나씩 디렉터리 순서로 나열합니다 (파이프 중단 방지) . 특수 디렉터리 만 제외 .
하고..
wc -l
: 줄 수find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
( 수행해야하고 결코 사용되지 않는 파일 크기 관련 오버 헤드를 제외하기 위해) 대신 사용 하는 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
기반 변형 과 매우 유사 )
현재 디렉토리에있는 파일도 계산해야하는 경우이 향상된 버전을 사용하십시오.
{ 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 대신 ls를 반복하여 수행 할 수도 있습니다.
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
설명:
for f in */;
-모든 디렉토리를 반복
do echo "$f ->
-각 디렉토리 이름 인쇄
$(ls $f | wc -l)
-이 디렉토리에 대해 ls를 호출하고 행을 계산합니다.
for f ./* ; do echo $f $(ls "$f" | wc -l); done
이것은 디렉토리 이름 뒤에 디렉토리의 파일 수를 반환해야합니다.
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에있는 invoke 당신이하지 않는 떠들썩한 기능을 실행 할 수 없습니다, 당신은 명시 적으로 새로운 쉘에 현재 범위에 정의 된 함수를 export 할 필요가있다.
./dir1/dir2/dir3
(의 파일 dir1
과 파일을 dir1/dir2/dir3
별도로 계산 dir1/dir2
하고 둘 다 의 파일과 별도로 계산하는 대신 포함 된 파일과 하위 디렉터리를 모두 함께 계산 /dir1
).
@glenn jackman의 답변 과 @pcarvalho의 답변을 결합 했습니다 (주석 목록에서 문자 ' ` '(backtick) 의 추가 스타일 제어 기능 때문에 pcarvalho의 답변에 문제가 있습니다 ).
내 스크립트는 경로를 augument로 받아들이고 디렉토리 목록을로 정렬 할 수 있으며 "파일 이름의 공백"문제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 f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'
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 / 편집기 제외 경로에 폴더를 추가해야하며 다른 파일 수는 이상적으로 최대 값을 초과하지 않아야합니다 (변경 가능).
이것은 전체 개수를 제공합니다.
for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'
./
있습니까?