명령 행을 사용하여 디렉토리에서 파일 수를 얻으려면 어떻게해야합니까?

파일 수가 많은 디렉토리가 있습니다. ls카운트를 제공 하는 스위치 가 보이지 않습니다 . 파일 수를 얻는 명령 줄 마술이 있습니까?



답변

“파일”의 광범위한 정의 사용

ls | wc -l

숨겨진 파일은 포함되지 않으며 파일 이름에 줄 바꿈 문자가 포함되지 않는다고 가정합니다.

숨겨진 파일 ( .및 제외 ..) 을 포함하고 개행 문자의 문제점을 피 하려면 다음 과 같은 표준 방법을 사용하십시오.

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

또는 재귀 적으로 :

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


답변

파일의 좁은 정의 :

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


답변

ls -1 | wc -l

$ ls --help | grep -- '  -1'
    -1                         list one file per line

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS : 참고 ls-<번호-하나> | 화장실-<letter-l>


답변

아마도 ls/ wcpair를 사용하는 가장 완전한 대답 은

ls -Aq | wc -l

도트 파일을 세고 싶다면

ls -q | wc -l

그렇지 않으면.

  • -A도트 파일을 계산하지만, 생략하는 것입니다 ....
  • -q만들기 ls와 비 그래픽 문자, 특히 개행 문자를 대체 ?각 파일에 대해 출력 1 개 라인을 만들고,

ls터미널 에서 한 줄 출력을 얻으려면 (즉 wc, 으로 파이핑하지 않고 ) -1옵션을 추가해야합니다.

( lscoreutils 8.23 으로 테스트 한 동작 )


답변

현재 디렉토리에 숨겨지지 않은 파일이 하나 이상 포함되어있는 경우 :

set -- *; echo "$#"

이것은 모든 글로브에 대해 일반화 할 수 있습니다.

스크립트에서 이는 위치 매개 변수를 겹쳐 써서 유감스럽게도 부작용이있는 경우가 있습니다. 서브 쉘을 사용하거나 다음과 같은 함수 (Bourne / POSIX 버전)를 사용하여이를 해결할 수 있습니다.

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

다른 해결책은 $(ls -d -- * | wc -l)입니다. glob가 *이면 명령을 단축 할 수 있습니다 $(ls | wc -l). 출력 결과를 파싱하면 ls항상 불편하지만 파일 이름에 줄 바꿈이 포함되어 있지 않거나 ls이스케이프 처리되지 않는 한 작동 합니다. 그리고 $(ls -d -- * 2>/dev/null | wc -l)일치하지 않는 glob의 경우를 정상적으로 처리 할 수 ​​있다는 장점이 있습니다 (즉,이 경우 0을 반환하지만 set *glob이 비어있는 경우이 방법을 엄밀하게 테스트해야 함).

파일 이름에 개행 문자가 포함될 수있는 경우 다른 방법을 사용하는 것 $(ls -d ./* | grep -c /)입니다.

일치하는 파일이 많으면 glob의 확장을 전달하는 데 의존하는 솔루션이 인수 목록에 너무 긴 오류로 ls실패 할 수 있습니다.


답변

나는 발견했다 du --inodes유용하지만 버전 확실하지 않다 du가 필요합니다. 그것은 사용하는 다른 방법보다 실질적으로 더 빨리해야 find하고 wc.

우분투 17.10에서는 다음이 작동합니다.

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

와 결합 | sort -nr포함하는 아이 노드 수를 기준으로 내림차순으로 정렬합니다.


답변

-U를 추가하면 ls / wc 쌍을 사용하는 동안 훨씬 빠릅니다 (정렬하지 마십시오).

ls -AqU | wc -l


답글 남기기