파일 이름에 줄 바꿈(또는 기타 이상한 문자)이 포함될 수 있는 디렉터리의 파일 수

파일 이름에 줄 바꿈(또는 기타 이상한 문자)이 포함될 수 있는 디렉터리의 파일 수

특정 디렉터리에 포함된 항목(파일, 하위 디렉터리 등)의 개수를 알고 싶습니다.

그것에 대해 많은 질문이 있는 것 같지만 대부분의 답변은 (전부는 아니지만) 에 의존하는 것 같습니다 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

당신에게 필요한 개수를 알려줄 것입니다.

도움이 되었기를 바랍니다.

관련 정보