특정 디렉터리에 포함된 항목(파일, 하위 디렉터리 등)의 개수를 알고 싶습니다.
그것에 대해 많은 질문이 있는 것 같지만 대부분의 답변은 (전부는 아니지만) 에 의존하는 것 같습니다 wc -l
. 예를 들어:
ls -1 | wc -l
그러나 하나 이상의 파일 이름에 새 줄이 포함되어 있으면 잘못된 대답이 제공됩니다. 여기서 또 다른 문제는 ls -1
파일 이상의 것이 반환될 수 있다는 것입니다.
이식성이 없는 답변은 다음과 같습니다.수천 개의 유사한 질문 중 하나의 댓글에 숨겨져 있습니다.. 작동하지만 불행히도 -printf
내 배포판에서 사용할 수 없는 것에 의존합니다.
find -maxdepth 1 -type f -printf "\n" | wc -l
(갓 괴짜에 의해)
이름에 문자가 포함된 파일을 올바르게 처리할 수 있는 보다 이식 가능한 솔루션이 있습니까?
답변1
위치 매개변수가 필요하지 않다고 가정하면 다음을 수행할 수 있습니다.설정하다계산해 보세요.
set -- .* *
echo $#
이는 다음의 효과를 제한하기 위해 함수 또는 서브쉘 내에 있을 수 있습니다 set
.
countfiles() {
set -- .* *
echo $#
}
countfiles
또는
(set -- .* *; echo $#)
여기서는 함수 또는 하위 쉘의 매개변수만 "손실"되고 기본 컨텍스트의 위치 매개변수는 변경되지 않은 채 유지됩니다.
경로를 지정할 수도 있습니다.
set -- path/to/dir/.* path/to/dir/*
echo $#
숨겨진 파일의 구체적인 확장은 셸 설정에 따라 다릅니다.확장 시 POSIX 쉘에는 다음이 포함되어야 합니다 .
...
.*
, 따라서 이러한 항목이 계산됩니다. 셀 수 없는 경우에는 확인하세요.예결과에서 2를 포함하고( $1
합계 참조) 뺍니다.$2
일부 셸에서는 점 확장을 구성할 수 있으며 및/또는 추가 확장( )을 사용하여 Bash에서 다음을 사용할 수 .[^.]* ..?*
있습니다 ..
..
dotglob
shopt -s dotglob
set -- *
echo $#
답변2
아래 코드는 그다지 우아하지는 않지만 이식성이 있어야 합니다. 이는 쉘 산술에 의존합니다.
n=0; for f in *; do n=$((n+1)); done; echo "$n"
숨겨진 파일은 포함되지 않습니다. 필요한 경우 반복 가능한 목록을 확장해야 합니다.
n=0; for f in * .*; do n=$((n+1)); done; echo "$n"
껍질에 따라 n=$((n+1))
깨질 수 있습니다 ((n++))
.
노트명시적인 셸 루프를 사용하면 이 접근 방식이 상당히 느려지는데, 이는 수천 개의 파일이 포함된 디렉터리를 처리하는 경우 눈에 띄게 나타날 수 있습니다. 이것스티븐 키트의 답변훨씬 빠르지만 쉘 스크립팅에 익숙하지 않은 경우 약간 모호할 수 있습니다.
답변3
네가 원한다면POSIX 준수bash
(이는 해당 을 제외한다는 의미이기도 함 shopt -s dotglob
), 디렉토리의 파일 수를 계산하는 한 가지 방법은 다소 느린 방법입니다.
find . -path './?*' ! -type f -prune -o -type f -exec echo x \; | wc -l
가지고 있는 것에 관심이 없다면 크게 단순화할 수 있습니다.
find . -path './?*' -prune -exec echo x \; | wc -l
실제로,또 다른 대답, 현재 디렉터리에 있는 디렉터리가 아닌 모든 디렉터리(아마도 파일일 뿐이지만 장치 및 파이프가 있는 경우 포함)의 수를 제공합니다.
( set -- * .* ; all=$#; set -- */ .*/ ; echo $(( all - $# -2 )) )
답변4
inode 번호를 찾아보세요. 파일 이름은 포함되지 않습니다.
$ find . -type f -printf '%i\n'
하지만 결과를 보면 printf가 없습니다.
$ find . -type f -name 'test*' -exec stat -c "%i" {} \;
inode만 반환합니다.
$ find . -type f -name 'test*' -exec stat -c "%i" {} \; | wc -l
당신에게 필요한 개수를 알려줄 것입니다.
도움이 되었기를 바랍니다.