user4556274 님은 이미 그 이유에 답변하셨습니다 . 내 대답은 파일을 올바르게 계산 하는 방법 에 대한 추가 정보를 제공하는 것 입니다.
유닉스 커뮤니티에서 일반적인 합의는 파일 이름에 제어 문자 또는 숨겨진 문자가 포함될 수 있기 때문에 출력ls
을 구문 분석 하는 것은 매우 나쁜 생각 입니다. 예를 들어 파일 이름의 줄 바꿈 문자로 인해 ls | wc -l
출력에 5 줄이 ls
있지만 실제로는 디렉토리에 파일이 4 개뿐입니다.
$> touch FILE$'\n'NAME
$> ls
file1.txt file2.txt file3.txt FILE?NAME
$> ls | wc -l
5
방법 # 1 : 유틸리티 찾기
find
일반적으로 주위에 작업 파일 이름을 구문 분석에 사용되는 명령은, 인쇄에 의해 여기 우리를 도울 수 inode 번호를 . 디렉토리 또는 파일이면 하나의 고유 한 inode 번호 만 있습니다. 따라서 via를 사용 -printf "%i\n"
하고 제외 하면 정확한 파일 수를 가질 수 있습니다. ( 하위 디렉토리로 재귀 내림차순을 방지하기위한 사용에 유의하십시오 ).
-not -name "."
-maxdepth 1
$> find -maxdepth 1 -not -name "." -print
./file2.txt
./file1.txt
./FILE?NAME
./file3.txt
$> find -maxdepth 1 -not -name "." -printf "%i\n" | wc -l
4
방법 # 2 : globstar
간단하고 빠르며 주로 이식 가능한 방법 :
$ set -- *
$ echo $#
228
set
명령은 쉘의 위치 매개 변수 (에서 $<INTEGER>
와 같은 변수) 를 설정하는 데 사용됩니다 echo $1
. 이것은 종종 /bin/sh
배열 부족의 한계 를 해결하는 데 사용됩니다 . 추가 검사를 수행하는 버전은 Unix & Linux에 대한 Gille의 답변 에서 찾을 수 있습니다 .
등의 지원 배열, 즉 쉘에서 bash
, 우리가 사용할 수 있습니다
items=( dir/* )
echo ${#items[@]}
의견에서 steeldriver가 제안한대로 .
find
사용 된 방법 wc
과 비슷한 속임수 와 globstar를 사용하여 한 stat
줄 당 inode 수를 계산할 수 있습니다 .
$> LC_ALL=C stat ./* --printf "%i\n" | wc -l
4
다른 방법은 와일드 카드 인 for
루프 를 사용하는 것 입니다. (이 테스트는 다른 디렉토리를 사용하여이 방법이 하위 디렉토리로 내려가는 지 여부를 테스트합니다.-16은 내에서 확인 된 항목 수입니다. ~/bin
)
$> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1
16
방법 # 3 : 다른 언어 / 통역사
파이썬은 또한 내 os.listdir()
함수가 주어진 목록의 길이를 인쇄하여 문제가있는 파일 이름을 처리 할 수 있습니다 (비 재귀 적이며 인수로 제공된 디렉토리의 항목 만 나열합니다).
$> python -c "import os ; print os.listdir('.')"
['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
$> python -c "import os ; print(len(os.listdir('.')))"
4
참조
ls | wc -l
파일 이름에 줄 바꿈이있는 파일이 있으면 실패합니다.find . -mindepth 1 -maxdepth 1 -printf . | wc -c