디렉토리의 파일 수를 계산하는 가장 좋은 방법은 무엇입니까? 구문 분석하는 것이 위험한 경우

ls펑키 한 문자 (공백 \n,, …)를 깨뜨릴 수 있기 때문에 출력을 구문 분석하는 것이 위험한 경우 디렉토리의 파일 수를 아는 가장 좋은 방법은 무엇입니까?

나는 보통 find이 파싱을 피하기 위해 의존 하지만, 마찬가지로 find mydir | wc -l같은 이유로 깨질 것입니다.

나는 지금 Solaris에서 일하고 있지만 가능한 한 다른 유니스와 다른 쉘에서 이식 가능한 답변을 찾고 있습니다.



답변

이 트릭은 어떻습니까?

find . -maxdepth 1 -exec echo \; | wc -l

휴대용로 find하고 wc.


답변

외부 유틸리티없이 루프를 사용하거나 루프를 사용하지 마십시오.

shopt -s dotglob
files=(*)
echo ${#files[@]}

KSH에서 교체 shopt -s dotglobFIGNORE=.?(.). zsh에서로 바꾸 setopt glob_dots거나 shopt통화를 제거 하고을 사용하십시오 files=(*(D)). 또는 도트 파일을 포함하지 않으려면 그냥 줄을 삭제하십시오. 점 파일에 관심이없는 경우 :

set -- *
echo $#

도트 파일을 포함하려면 다음을 수행하십시오.

set -- *
if [ -e "$1" ]; then c=$#; else c=0; fi
set .[!.]*
if [ -e "$1" ]; then c=$((c+$#)); fi
set ..?*
if [ -e "$1" ]; then c=$((c+$#)); fi
echo $c

답변

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

80 년대 이후 시스템에 이식성이 뛰어나야합니다.

모든 디렉토리 항목을 제외한 카운트 그 ...현재 디렉토리이다.

서브 디렉토리의 파일도 계산하려면 다음을 수행하십시오.

find .//. ! -name . | grep -c //

(필요하지 않기 때문에 Unix V6 (1975)에도 이식 가능해야 함 -prune)


답변

시험:

ls -b1A | wc -l

-b인쇄 할 수없는 문자를 가지며 , 및 -A파일을 제외한 모든 파일을 표시합니다 (파이프의 기본값이지만 명시 적으로 좋습니다)....

우리가 더 높은 수준의 스크립팅 언어를 포함하는 한, 파이썬에서 한 줄짜리가 있습니다.

python -c 'import os; print len(os.listdir(os.sep))'

또는 완전한 ‘찾기’가있는 경우 :

python -c 'import os; print len([j for i in os.walk(os.sep) for j in i[1]+i[2]])'

답변

Yoc는 이러한 구성을 사용할 수 있습니다.

I=0; for i in * ; do ((I++)); done ; echo $I

그러나 Argument list too long.디렉토리에 파일이 너무 많은 경우 와 같이 오류 가 발생할 수 있습니다. 그러나 100 억 개의 파일이있는 디렉토리에서 테스트했으며 잘 작동했습니다.


답변

상대적으로 이식성이 좋은 펄을 고려 했습니까?

다음과 같은 것 :

use File::Find;

$counter = 0;

sub wanted {
  -f && ++$counter
}

find(\&wanted, @directories_to_search);
print "$counter\n";

답변

이것을 => -i (노드 번호의 경우) 및 -F ( ‘/’와 함께 디렉토리 이름 추가) 옵션과 함께 ls 사용하십시오 .

ls -ilF | egrep -v '/' | wc -l