파일 길이를 재귀적으로 인쇄

파일 길이를 재귀적으로 인쇄

디렉토리에 있는 모든 *.txt 파일의 길이를 어떻게 인쇄합니까?

예: 디렉터리 콘텐츠:

FileA.txt 
FileB.txt
FileC.txt 
FileA.csv

*.txt 길이:

less FileA.txt | wc -l 
43
less FileB.txt | wc -l 
13
less FileC.txt | wc -l 
3

원하는 출력(출력 파일에 기록됨):

43
13
3

(노력 중이지만 성공하지 못했습니다: ls *.txt| while read FN; do wc -l < $FN >> output; done-빈 파일 출력 중)

답변1

wc -l -- *.txt

또는 파일 이름을 출력에 포함하지 않으려는 경우(파일 이름에 개행 문자가 포함되어 있지 않다고 가정함):

wc -l -- *.txt | awk '{print $1}'

단일 쉘 명령줄에 들어갈 수 없을 만큼 *.txt 파일이 너무 많고 find가 이를 지원한다고 가정하는 경우 -maxdepth:

find . -maxdepth 1 -type f -name '*.txt' -exec wc -l {} + | 
    awk '$2 != "total" {print $1}'

(이전 파일과 달리 파일 목록을 정렬하지 않고 숨겨진 파일을 포함하며 일반 파일에 대한 심볼릭 링크를 포함하여 비정규 파일을 제외합니다.)

물론 이들 중 하나의 출력을 파일로 리디렉션하거나 추가 처리를 위해 다른 프로그램으로 파이프할 수 있습니다.

답변2

몇 가지 대안:

GNU 사용 sed:

sed -sn '$=' ./*.txt

(빈 파일 수를 보고하지 않고 대신 wc -l마지막 개행 이후의 가짜 데이터를 추가 행으로 계산합니다.)

기본적으로 와 같은 와일드카드 패턴에는 *.txt숨겨진 파일이 포함되지 않습니다.

GNU 사용 awk:

awk 'ENDFILE{print FNR}' ./*.txt

이번에는 0빈 파일을 받게 됩니다. 가짜 데이터에 대한 설명은 GNU와 동일합니다 sed.

$ seq 10 > a.txt; : > b.txt; printf spurious > c.txt; seq 20 > .hidden.txt; echo test > $'a\n3 4.txt'
$ wc -l ./*.txt
 1 ./a
3 4.txt
10 ./a.txt
 0 ./b.txt
 0 ./c.txt
11 total
$ wc -l ./*.txt | awk '/\//{print $1}'
1
10
0
0
$ sed -ns '$=' ./*.txt
1
10
1
$ awk 'ENDFILE{print FNR}' ./*.txt
1
10
0
1

재귀적으로 파일 이름별로 목록을 정렬하려면 다음을 사용하거나 zsh또는 ksh -o globstar다음을 사용하세요 .bash -O globstaryash -o extended-glob

wc -l .//**/*.txt | awk '/\/\//{print $1}'
sed -ns '$=' ./**/*.txt
awk 'ENDFILE{print FNR}' ./**/*.txt

답변3

당신은 그것을 사용할 수 있습니다와일드카드결합하다화장실각 파일의 줄 수를 가져오는 명령:

wc -l *.txt

출력은 다음과 같습니다.

13.a.txt

29b.txt

3d.txt

총 45개 항목

총 행 수를 모르는 경우 다음으로 파이프할 수 있습니다.머리주문하다전제는 계산할 파일이 여러 개 있다는 것입니다.:

wc -l *.txt |head -n -1

파일이 아닌 줄 수만 원하는 경우:

wc -l *.txt |head -n -1 |awk '{print $1}'

또는 파일이 하나이든 여러 개이든 상관없이 총 개수를 피하기 위해 for 루프를 사용할 수 있지만 이는 가장 추악한 방법입니다.

for i in $(ls *.txt);do wc -l $i;done

관련 정보