디렉토리의 파일 수를 계산하는 스크립트

디렉토리의 파일 수를 계산하는 스크립트

현재 디렉터리(하위 디렉터리 제외)에 있는 파일 수를 계산하는 스크립트를 찾고 있습니다. 각 파일을 반복하고 디렉터리가 아닌 경우 개수를 늘려야 합니다. 출력은 파일 수를 나타내는 정수여야 합니다.

나는 그것을 알아

find . -type f | wc -l

그러나 나는 그것이 전체 계산 작업을 수행한다고 생각하지 않습니다. 이것은 과제이므로 나에게 올바른 방향을 알려주고 싶다면 좋을 것입니다.

답변1

일반 파일만 원하신다면,

GNU 사용 find:

find . -maxdepth 1 -type f -printf . | wc -c

기타 find:

find . ! -name . -prune -type f -print | grep -c /

-print | wc -l( 파일 이름에 개행 문자가 있으면 작동하지 않으므로 이를 원하지 않습니다 .)

그리고 zsh:

files=(*(ND.)); echo $#files

그리고 ls:

ls -Anq | grep -c '^-'

일반 파일에 대한 심볼릭 링크를 포함하려면 with GNU , with other 또는 with -type f로 변경 하거나 옵션을 에 추가 하세요 . 하지만 얻을 수 있다는 점에 유의하세요.-xtype ffind-exec test -f {} \;find.-.zsh-Lls거짓 부정심볼릭 링크 대상 유형을 결정할 수 없는 상황(예: 액세스 권한이 없는 디렉토리에 있기 때문에).

일반 파일뿐만 아니라 모든 종류의 파일(기호 링크, 디렉터리, 파이프, 장치...)을 원하는 경우:

find . ! -name . -prune -printf . | wc -c

-print | grep -c /( with non-GNU find, (ND.)with (ND), zshwith grep -c '^-'로 변경됨 wc -l) ls.

그러나 로 바꾸지 않는 한 이것은 중요하지 않습니다 . .또는 ..(보통 사람들은 항상 거기에 있기 때문에 실제로 신경 쓰지 않습니다).-A-als

디렉터리를 제외한 모든 유형의 파일을 원하는 경우 다음 -type f으로 바꾸고 ! -type d(또는 ! -xtype d디렉터리에 대한 심볼릭 링크도 제외) 로 바꾸고 , 로 바꾸고 zsh, 로 바꾸 십시오 ..^/lsgrep -c '^-'grep -vc '^d'

숨겨진 파일 ! -name '.*'zsh제외 하려면 .DlsA

답변2

하위 디렉터리 제외

find . -maxdepth 1 -type f | wc -l

이는 모든 파일 이름에 개행 문자가 포함되어 있지 않으며 찾기 구현이 이 -maxdepth옵션을 지원한다고 가정합니다.

답변3

도착하다반복현재 디렉토리의 모든 항목에 대해 다음을 사용하십시오.

for f in ./*; do

그런 다음 사용

[ -f "$f" ]

또는

test -f "$f"

얻은 것이 일반 파일(또는 심볼릭 링크)인지 테스트합니다.

소켓 파일이나 기타 특수 파일은 제외됩니다.

도착하다디렉토리만 제외, 사용

[ ! -d "$f" ]

대신에.

변수에 대한 참조는 중요합니다. 그렇지 않으면 이름이 지정된 디렉터리와 이름이 지정된 파일이 있으면 hello world잘못 계산됩니다 hello.

또한 일치해야합니다숨겨진.파일(앞에 이름이 있는 파일)의 경우 dotglob(in)을 사용하여 쉘 옵션을 설정하거나 다음을 사용할 수 있습니다.shopt -s dotglobbash

for f in ./* ./.*; do

이러한 glob 패턴이 아무것도 일치하지 않는 경우 쉘이 아무것도 반환하지 않도록 하려면 쉘 옵션(in )을 설정하는 것이 nullglob현명할 수도 있습니다 (그렇지 않으면 리터럴 문자열 및/또는 in 을 얻게 됩니다).bash./*./.*f

참고: 이것은 과제이기 때문에 전체 스크립트를 제공하는 것을 피했습니다.

답변4

줄 바꿈 및 기타 인쇄할 수 없는 문자가 포함된 파일이 포함된 항목을 처리하려는 경우 이 솔루션이 작동합니다. 그러나 이는 귀하의 작업에 거의 확실히 중복됩니다.

find . -maxdepth 1 -type f -print0 | tr -dc '\0' | wc -c

이것이 하는 일은 \0각 파일 이름의 끝 부분을 제외한 모든 것을 삭제하는 것입니다. 그런 다음 이러한 문자를 계산하여 파일 수를 도출합니다.

관련 정보