짧은 답변:
\ls -afq | wc -l
( .
과를 포함 ..
하므로 2를 빼십시오.)
디렉토리에 파일을 나열하면 다음과 같은 세 가지 일반적인 상황이 발생할 수 있습니다.
- 디렉토리에서 파일 이름을 열거합니다. 이 방법은 피할 수 없습니다. 디렉토리에서 파일을 열거하지 않고 계산할 수있는 방법은 없습니다.
- 파일 이름 정렬 쉘 와일드 카드와
ls
명령이 그렇게합니다.
stat
디렉토리인지 여부와 같이 각 디렉토리 항목에 대한 메타 데이터를 검색하기 위해 호출 합니다.
# 3은 각 파일마다 inode를로드해야하기 때문에 가장 비쌉니다. 이에 비해 # 1에 필요한 모든 파일 이름은 몇 블록에 간결하게 저장됩니다. # 2는 약간의 CPU 시간을 낭비하지만 종종 거래 차단기가 아닙니다.
파일 이름에 줄 바꿈이 없으면 ls -A | wc -l
디렉토리에 몇 개의 파일이 있는지 간단하게 알려줍니다. 당신의 별칭이있는 경우 조심하십시오 ls
,이에 대한 호출 트리거 할 수있다 stat
(예를 ls --color
또는 ls -F
전화로를 필요로하는 파일 형식을 알 필요 stat
), 그래서 명령 줄에서 전화 command ls -A | wc -l
또는 \ls -A | wc -l
별칭을 방지하기 위해.
파일 이름에 줄 바꿈이 있으면 줄 바꿈이 나열되는지 여부는 Unix 변형에 따라 다릅니다. GNU coreutils 및 BusyBox는 기본적으로 ?
줄 바꿈 을 표시 하므로 안전합니다.
ls -f
항목을 정렬하지 않고 나열하려면 호출 하십시오 (# 2). 이 기능은 자동으로 켜집니다 -a
(적어도 최신 시스템에서는). -f
옵션은 POSIX이 아니라 선택 상태입니다 대부분의 구현은 지원하지만 BusyBox는 지원하지 않습니다. 이 옵션 -q
은 줄 바꿈을 포함하여 인쇄 할 수없는 문자를 ?
; POSIX이지만 BusyBox에서 지원하지 않으므로 이름에 개행 문자가 포함 된 파일을 과도하게 계산하여 BusyBox 지원이 필요한 경우 생략하십시오.
디렉토리에 서브 디렉토리가없는 경우 대부분의 버전은 해당 항목을 find
호출하지 않습니다 stat
(리프 디렉토리 최적화 : 링크 수가 2 인 디렉토리는 서브 디렉토리를 가질 수 없으므로 서브 디렉토리 find
가 없으면 항목의 메타 데이터를 찾을 필요가 없습니다. -type
필요 조건 등 ). 그래서 find . | wc -l
디렉토리 하위 디렉토리가 없다고과 파일 이름이 개행 문자가없는 것을 제공 디렉토리에있는 파일을 계산하는 휴대용 빠른 방법입니다.
디렉토리에 서브 디렉토리가 없지만 파일 이름에 개행이 포함될 수있는 경우 이들 중 하나를 시도하십시오 (두 번째 디렉토리는 지원되는 경우 더 빠르지 만 눈에 띄지 않을 수 있음).
find -print0 | tr -dc \\0 | wc -c
find -printf a | wc -c
반면에 find
디렉토리에 하위 디렉토리가있는 경우 사용하지 마십시오 . 모든 항목을 find . -maxdepth 1
호출 stat
할 수도 있습니다 (최소한 GNU find 및 BusyBox find 사용). 정렬 (# 2)을 피하지만 성능을 저하시키는 inode 조회 (# 3)의 가격을 지불합니다.
외부 도구가없는 쉘에서을 사용하여 현재 디렉토리의 파일 수를 실행할 수 있습니다 set -- *; echo $#
. 빈 파일에서 도트 파일 (이름이로 시작하는 파일)이 누락 .
되고 0 대신 1이보고됩니다. 외부 프로그램을 시작할 필요가 없기 때문에 작은 디렉토리에서 파일을 계산하는 가장 빠른 방법입니다 (zsh 제외)는 정렬 단계 (# 2)로 인해 더 큰 디렉토리의 시간을 낭비합니다.
bash에서 이것은 현재 디렉토리의 파일을 계산하는 신뢰할 수있는 방법입니다.
shopt -s dotglob nullglob
a=(*)
echo ${#a[@]}
ksh93에서 이는 현재 디렉토리의 파일을 계산하는 신뢰할 수있는 방법입니다.
FIGNORE='@(.|..)'
a=(~(N)*)
echo ${#a[@]}
zsh에서 이것은 현재 디렉토리의 파일을 계산하는 신뢰할 수있는 방법입니다.
a=(*(DNoN))
echo $#a
mark_dirs
옵션이 설정되어 있으면 반드시 끄십시오 : a=(*(DNoN^M))
.
POSIX 셸에서 이것은 현재 디렉토리의 파일을 계산하는 신뢰할 수있는 방법입니다.
total=0
set -- *
if [ $# -ne 1 ] || [ -e "$1" ] || [ -L "$1" ]; then total=$((total+$#)); fi
set -- .[!.]*
if [ $# -ne 1 ] || [ -e "$1" ] || [ -L "$1" ]; then total=$((total+$#)); fi
set -- ..?*
if [ $# -ne 1 ] || [ -e "$1" ] || [ -L "$1" ]; then total=$((total+$#)); fi
echo "$total"
이러한 모든 메소드는 zsh를 제외한 파일 이름을 정렬합니다.
ls -l|wc -l
때문에의 첫 번째 행의 전체 블록 떨어져 하나가 될 것입니다ls -l
출력