it-swarm-ko.tech

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

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

219
Blake

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

ls | wc -l

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

숨겨진 파일을 포함 시키려면 (...) 개행 문자 문제를 피하십시오. 일반적인 방법은 다음과 같습니다.

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

또는 재귀 적으로 :

find .//. ! -name . -print | grep -c //
279
James Roth

파일의 좁은 정의 :

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
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-<number-one> | 화장실-<letter-l>

15
nicomen

du --inodes가 유용하다는 것을 알았지 만 어떤 버전의 du이 (가) 필요한지 확실하지 않습니다. findwc를 사용하는 대체 방법보다 훨씬 빠릅니다.

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

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

포함하는 inode 수를 기준으로 내림차순으로 정렬하려면 | sort -nr와 결합하십시오.

12
krlmlr

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

ls -Aq | wc -l

도트 파일을 세고 싶다면

ls -q | wc -l

그렇지 않으면.

  • -A는 도트 파일을 세지 만 ...는 생략합니다.
  • -q make ls 그래픽이 아닌 문자, 특히 개행 문자를 ?로 바꾸어 각 파일에 대해 출력을 한 줄로 만듭니다.

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

(ls의 동작은 coreutils 8.23으로 테스트되었습니다)

12
Frax

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

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에 전달하는 솔루션 중 하나가 인수 목록이 너무 깁니다 오류와 함께 실패 할 수 있습니다.

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

ls -AqU | wc -l
5
Jbnair

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

tree

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

tree -a

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

Sudo apt-get install tree

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

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

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

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

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

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

이렇게하면 구문 분석 ls 출력의 ordeal 에서 벗어날 수 있습니다.


관련 :

1
codeforester

다음은 한 Gilles 게시 라인에 따른 또 다른 기술입니다.

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

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

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

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

1
srpatch

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

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

tailcut와 같은 일부 사랑받는 명령의 사용에 주목할 가치가 있습니다. 또한 기본적으로 트리는 사용할 수 없습니다. 위의 명령은 먼저 레벨 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
jonaprieto

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

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

당신은 확인할 수 있습니다 :

ls -l | grep -v ^l | wc -l
0
AMIC MING