디렉토리에서 모든 파일의 행 수를 사람이 읽을 수있는 형식으로 나열하는 방법


40

큰 csv 파일이 포함 된 디렉토리 및 하위 디렉토리 목록이 있습니다. 이 파일들에는 약 5 억 줄이 있으며, 각각 레코드입니다. 나는 알고 싶습니다

  1. 각 파일에 몇 줄이 있습니까?
  2. 디렉토리에 몇 줄이 있습니까?
  3. 총 몇 줄

가장 중요한 것은, 예를 들어 '사람이 읽을 수있는 형식'으로 필요합니다. 12345678이 아니라 12,345,678

이 작업을 3 가지 방법으로 배우는 것이 좋습니다. 일반 바닐라 bash 도구, awk 등 및 perl (또는 python).

답변:


56

각 파일에 몇 줄이 있습니까?

wc원래 단어 수에는을 사용 하지만 줄, 단어, 문자, 바이트 및 가장 긴 줄 길이를 사용할 수 있습니다. 이 -l옵션은 줄을 세도록 지시합니다.

wc -l <filename>

이것은 라인 수를 출력합니다 :

$ wc -l /dir/file.txt
32724 /dir/file.txt

데이터를 파이프 할 수도 wc있습니다.

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63

디렉토리에 몇 줄이 있습니까?

시험:

find . -name '*.pl' | xargs wc -l

다른 하나의 라이너 :

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l

BTW, wc명령은 줄이 아닌 새 줄 코드를 계산합니다. 파일의 마지막 줄이 줄 바꿈으로 끝나지 않으면 계산되지 않습니다.

당신은 grep -c ^를 사용할 수 있습니다.

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

총 몇 줄

귀하가 올바르게 요청한 것을 이해하지 못했습니다. 예를 들어, 결과는 다음 형식으로 출력되며 각 파일의 줄 수를 보여줍니다.

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

또는 파일별로 파일이없는 총 줄 바꿈 문자 수만 다음 명령에 출력하는 것이 유용 할 수 있습니다.

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613

가장 중요한 것은, 예를 들어 '사람이 읽을 수있는 형식'으로 필요합니다. 12345678이 아니라 12,345,678

Bash에는 printf 함수가 내장되어 있습니다 :

printf "%0.2f\n" $T

항상 그렇듯이 여기에 언급 된 것과 동일한 결과를 얻는 데 사용할 수있는 여러 가지 방법이 있습니다.


그런데 예제에서 printf를 어떻게 사용합니까? wc -l에서 파이프로 연결하려고 시도했지만 작동하지 않았습니다.
Hexatonic

> 찾기를 시도하십시오. -name '* .pl'| xargs 화장실 -l | awk '{printf ( "% 0.2f", $ 1)} {print $ 2}'필요에 따라 'printf'출력 변경
malyy

사람이 읽을 수 있도록 숫자에 쉼표를 추가하지 않습니다. 끝에 0을 추가합니다.
Hexatonic

에코 1000000000000 | xargs를 printf와 "%"D \ n "1,000,000,000,000
Hexatonic

1
@Hexatonic가 printf에서 인수 읽지 않는다 stdin, 오히려 명령 줄에서 (에 배관 비교 echo에 배관 대를 cat, catstdin, echo하지 않습니다). 대신에 printf "$(find ... | xargs ...)"출력을 인수로 제공하는 데 사용 하십시오 printf.
BallpointBen

13

대부분의 경우 wc명령과 와일드 카드를 결합하면 *충분할 수 있습니다.
모든 파일이 단일 디렉토리에있는 경우 다음을 호출 할 수 있습니다.

wc -l src/*

여러 파일과 디렉토리를 나열 할 수도 있습니다.

wc -l file.txt readme src/* include/*

이 명령은 파일 목록과 줄 수를 보여줍니다.
마지막 줄은 모든 파일의 줄 합계입니다.


디렉토리의 모든 파일을 재귀 적으로 계산하려면 다음을 수행하십시오.

먼저 shopt -s globstar.bash_profile에 globstar를 추가 하십시오. globstar를 지원하려면 brew install bash필요한 경우 설치할 수있는 Bash ≥ 4.x가 필요합니다. 로 버전을 확인할 수 있습니다 bash --version.

그런 다음 다음을 실행하십시오.

wc -l **/*

globstar를 사용하지 않으면이 출력이 올바르지 않습니다.


그리고 currrent 디렉토리의 파일을 재귀 적으로 계산하기 위해 :wc -l **/*
Taylor Edmiston

@TaylorEdmiston 저에게 (Mac에서는) 파일을 정확히 한 디렉토리 만 계산합니다. 현재 디렉토리의 파일을 건너 뛰고 디렉토리가 두 개 이상인 모든 인스턴스의 경우 디렉토리임을 경고합니다. " wc: parent_dir/child_dir: read: Is a directory"
M. Justin

@Thomio globstar를 활성화해야합니다. macOS에서는 즉시 비활성화되어 있다고 생각합니다. 방금 명령을 추가하고 globstar를 활성화하는 방법을 편집하여 귀하의 답변에 보냈습니다.
Taylor Edmiston

2

이 명령은 각 디렉토리에 라인 코드 목록을 제공합니다.

find . -name '*.*' -type f | xargs wc -l

2

게임에 약간 늦었지만 dir의 크기로 인해 위와 같은 인수 오류가 발생했습니다. 이것은 나를 위해 일했다 :

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt


0

cat파일을 하나로 결합하고 stdout으로 모든 것을 출력 wc -l하면 디렉토리의 총 파일 행 수에 대해 수행 할 수 있습니다 .

cat /path/to/directory/* | wc -l

0

나는 다음에 대한 @malyy 답변을 보강 할 것입니다 (주석을 위해 크게).

총 몇 줄

많은 답변이 wc명령 줄 파일 옵션을 사용하고 xargs있습니다. 이것에 대한 문제는 xargs가 다소 작은 플랫폼 의존적 크기로 제한된다는 것입니다.

또한 BSD (macOS)와 GNU (linux / homebrew) 사이에는 차이가 wc있습니다.

GNU는 인수 ( --files0) 대신 파일에서 파일 목록을 읽을 수 있기 때문에 이상적입니다 .

mac을 사용 중이고 homebrew가있는 경우 다음을 수행해야합니다.

find . -name "*.pl" -print0 | gwc -l --files0=-

wc 대신 gwc를 주목하십시오 .

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