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


답변:


239

"파일"의 광범위한 정의 사용

ls | wc -l

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

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

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

또는 재귀 적으로 :

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

23
wc"단어 수"프로그램입니다. -l스위치 라인을 계산이됩니다. 이 경우의 출력에서 ​​행을 계산합니다 ls. 이것은 항상 주어진 디렉토리에 대한 파일 수를 얻는 방법을 항상 배웠습니다.
Sandy

20
참고 추가하십시오 ls않습니다 ls -1출력은 파이프 인 경우입니다.
lesmana

6
그것은 디렉토리에 모든 것을 얻지 못합니다-도트 파일을 놓치고 몇 줄을 더 모으십시오. 빈 디렉토리는 여전히 한 줄을 반환합니다. 그리고을 호출 ls -la하면 디렉토리에 세 줄이 생깁니다. 및 항목 ls -lA | wc -l을 건너 뛰고 싶습니다 . 그러나 당신은 여전히 ​​하나 하나 떨어져있을 것입니다. ...

1
빈 디렉토리는 나를 위해 0을 반환
제임스 로스에게

2
이름에 줄 바꿈이있는 파일을 두 번 계산하지 않는 올바른 방법은 다음과 같습니다 ls -q | wc -l.-숨겨진 파일은이 방법으로 계산되지 않으며 디렉토리도 계산됩니다.
godlygeek

31

파일의 좁은 정의 :

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

물론 -maxdepth 1파일을 재귀 적으로 계산 하기 위해를 생략 하거나 원하는 최대 검색 깊이에 맞게 조정할 수 있습니다.
user7089

1
이름에 개행 문자가 포함 된 파일이있는 경우이 방법은 파일을 두 번 잘못 계산합니다.
godlygeek

7
이름에 줄 바꿈이있는 파일을 두 번 계산하지 않는 find -maxdepth 1 -type f -printf "\n" | wc -l
올바른

+1 숨김 파일을 허용하고 디렉토리를 무시합니다
Michael Durrant

14
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>


10
대부분의 버전은 파이프로 출력 할 때 자동으로 ls수행 -1됩니다.
Dennis Williamson

3
@Dennis 흥미 롭습니다. 응용 프로그램이 출력이 파이프로 가고 있음을 알 수 있다는 것을 몰랐습니다.
xenoterracide

1
이 버전은 더 명시 적이므로 +했습니다. 예, ls가 파이프 된 경우 -1을 사용하지만 (시도 : ls | cat) -1 구문이 더 명확하다는 것을 알았습니다.
개브.

3
@xenoterracide : Bash에서 :[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
Dennis Williamson

2
내 테스트에서 파일 이름을 정렬하는 ls를 피하기 위해 -f 옵션을 제공하는 것이 훨씬 빨랐습니다. 불행히도 파일 이름에 줄 바꿈이 포함되어 있으면 여전히 잘못된 대답을 얻습니다.
Samuel Edwin Ward

10

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

ls -Aq | wc -l

도트 파일을 세고 싶다면

ls -q | wc -l

그렇지 않으면.

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

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

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


2
당신이 말했듯이, -1필요하지 않습니다. "콘솔 출력을 사용하여 파일 이름의 줄 바꿈을 처리 합니다 "와 관련하여 이것은 "인쇄 할 수없는 파일 이름 문자 및 <tab> 문자의 각 인스턴스를 강제 로 작성하는 -q스위치 ( -b휴대용이 아니라 대신 사용해야 함) 때문 입니다. <question-mark> ( '?') 문자로 구현됩니다. 구현이 출력이 터미널 장치 인 경우 기본적으로이 옵션을 제공 할 수 있습니다. " ls -Aq | wc -l를 들어 모든 파일 / 디렉토리 ls -qp | grep -c /를 계산 하거나 숨겨지지 않은 디렉토리 만 계산하려면 ...
don_crissti

입력 해 주셔서 감사합니다. 로 변경 -b되었습니다 -q.
Frax

7

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

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실패 할 수 있습니다.


1
실제로 13,923 개의 위치 매개 변수를 작성 하시겠습니까? 그리고 당신은 지역 변수를 만들 local거나 제거해야합니다 : eval $1=$#또는 그냥 사용 echo $#하고하십시오 number_of_files=$(count_words *).
Dennis Williamson

1
@ 데니스 : 요점의 일부는 포크를 피하는 것이 었습니다. 나는 그것이 21 세기의 관심사가 아니라고 생각합니다. 좋아, 나는 비 POSIX 쉘에 대해서는 더 이상 신경 쓰지 않는다는 것을 인정하므로 임시 변수를 피할 수 있었다.
Gilles

$#당신이 하나를 뺀 것 입니까 (편집하기 전에 그렇게하지 않았습니까)?
Dennis Williamson

@Dennis : 여전히 포크를 피하고 (라우터와 같은 CPU 속도가 느린 컴퓨터에서는 차이가 있습니다) 변수 이름을로 전달합니다 $1. 그래서 세고 싶은 것은 첫 번째 매개 변수가 아닌 매개 변수의 수입니다. ( shift변수 이름을 유지해야하기 때문에 사용할 수 없습니다 .) (음, 줄 에 대해 물었다면 ...)
Gilles

@Dennis : 생각하면 올 바르면 사용할 수 있습니다 shift.
Gilles

7

나는 발견했다 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포함하는 아이 노드 수를 기준으로 내림차순으로 정렬합니다.


5

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

ls -AqU | wc -l

1
-U그래도 GNU 전용입니다.
Stéphane Chazelas

4

tree 명령을 설치 한 후 다음을 입력하십시오.

tree

숨겨진 파일도 원하는 경우 :

tree -a

Debian / Mint / Ubuntu Linux를 사용하는 경우 다음 명령을 입력하여 tree 명령을 설치하십시오.

sudo apt-get install tree

-L 옵션은 디렉토리 트리의 최대 표시 레벨을 지정하는 데 사용됩니다. tree 명령은 원하는 수의 디렉토리 트리 수준을 고려하여 파일 수뿐만 아니라 디렉토리 수도 계산합니다.


tree를 입력하면 내가있는 디렉토리의 화면에 일종의 트리 출력이 표시되지만 파일 수가 표시되는 위치를 볼 수 없습니다.
charlesdarwin

2
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1그것은 비 재귀 할 것입니다 것은 find기본적으로 재귀
  • -type f 파일 만 포함합니다
  • -printf .귀여운 터치입니다. 파일 이름 대신 각 파일에 대해 점을 인쇄합니다. 이제 파일 이름을 처리하고 데이터를 저장할 수 있습니다. 우리는 단지 점을 세어야합니다 :)
  • | wc -c 문자 수

1

파이프 없음, 문자열 사본 없음, 포크 없음, 일반 bash 하나의 라이너

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount

1
디렉토리에 파일이없는 경우 값 1을 제공합니다. 파일 수, 파일 및 디렉토리 수를 세지 않습니다.
스티브

1

Gilles가 게시 한 라인을 따라 또 다른 기술이 있습니다 .

word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)

13,923 개의 요소가있는 배열을 만듭니다 (파일이 많은 경우).


c배열 의 요점은 무엇입니까 ? word_count() { echo "$#"; }충분할 것입니다. @Gilles 솔루션의 요점은 명령 대체 (ksh93 이외의 쉘에 포크 및 파이프 포함)를 사용하지 않도록 카운트를 반환 변수에 저장하는 것입니다.
Stéphane Chazelas

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

현재 디렉토리에있는 파일 만 나열 할 수 있습니다.


find . -type f현재 디렉토리와 하위 디렉토리에서 재귀 적으로 파일을 찾습니다.
dhag 2016 년

0

이것을 시도해보십시오.이 답변이 도움이되기를 바랍니다.

echo $((`ls -l | wc -l` -1 ))


0

이전에 주어진 답변을 개선했지만 이번에는 명시 적으로 수행합니다.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

tailand과 같은 사랑받는 명령의 사용을 주목할 가치가 있습니다 cut. 또한 기본적으로 트리는 사용할 수 없습니다. 위의 명령은 먼저 레벨 1의 디렉토리에 대한 정보를 캡처 한 다음 tail -n 1목표가 있는 마지막 줄 cut을 가져 와서 세 번째 단어를 가져옵니다.

예를 들어 다음 위치에 있습니다 /.

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

그렇다면 디렉토리 수를 묻는 것은 어떻습니까?


0

Linux에서 명령을 매우 강력하게 만들고 이름에 줄 바꿈이있는 파일을 처리하려면 다음을 사용하십시오.

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

이것은 파싱 출력 의 시련 에서 우리를 구해줍니다 ls.


관련 :


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.