디렉토리에 있는 모든 *.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 globstar
yash -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