wc로 줄을 세는 경우 디렉토리가있을 때마다 오류를 인쇄하지 마십시오


12

모든 /etc파일 의 총 줄 수를 세고 싶지만 하위 디렉토리의 파일은 계산하지 않기 때문에 다음 wc -l /etc/* | tail -1과 같이 입력했습니다. 출력은 다음과 같습니다.

xxxx is a directory 
yyyy is a directory
total 1752

내 질문은 어떻게 이러한 주석을 제거 (삭제) 할 수 있으며이 유형의 계산을 수행하는 더 좋은 방법이 있습니까?


1
/ etc에는 일반 파일 f뿐만 아니라 l 링크도 있기 때문에 find 사용은 100 % Wright가 아니라고 생각합니다. 따라서이 버전이 훨씬 좋습니다 : $ sudo wc -l / etc / * 2> / dev / null | 꼬리 -1
Hamza

답변:


14

오류 메시지를 / dev / null에 출력 할 수 있습니다

$ wc -l /etc/* 2>/dev/null | tail -1

이 명령을 사용하면 세계에서 읽을 수있는 파일의 줄 수만 볼 수 있습니다. 모든 파일의 줄 수를 보려면을 사용하여 명령을 높여야합니다 sudo.

$ sudo wc -l /etc/* 2>/dev/null | tail -1

8

파일을 격리하고 wc를 실행하십시오.

어떤 wc -l /etc/*일은 즉 *내부의 모든 항목을 확대 할 /etc/디렉토리. 따라서 목표는 파일을 분리하여 수행 wc하는 것입니다. 여러 가지 방법이 있습니다.

테스트와 루프

test더 자주로 약식 명령 또는 [사용할 수는 항목이 너무 같은 일반 파일인지 여부를 확인하는 방법은 다음과 같습니다

[ -f "$FILE" ]

따라서 우리가 할 수있는 일은 위의 명령이 true를 반환하는 경우에만 모든 항목을 반복 /etc/하고 실행 wc하는 것입니다. 이렇게 :

for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done             

찾기

우리는 또한 사용할 수 있습니다 find-maxdepth, -type-exec플래그

find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +

  • -maxdepth디렉토리 구조의 깊이를 알려줍니다. 값 1은 원하는 디렉토리의 파일 만 의미합니다.
  • -type f 일반 파일을 찾도록 지시하거나, -osybolic 링크 (로 표시)에 대한 OR ( 플래그 로 표시)을 찾습니다 type l. 이 모든 장점은 ()이스케이프 된 괄호로 묶여서 \쉘은 find다른 것보다는 명령의 일부로 해석합니다 .
  • -exec COMMAND {} +여기서 structure는 우리가 제공하는 모든 명령을 실행 +하여 발견 된 모든 파일을 가져 와서 명령 행 인수로 명령을 넣습니다.

생산 전체에 우리는 파이프 출력 할 수 tail있도록 좋아

$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1           
[sudo] password for xieerqi: 
 11196  total

사이드 노트

wc -l /etc/* 2>/dev/null | tail -1LD James의 답변 에서처럼을 사용하는 것이 더 쉽지만 find어려운 파일 이름을 처리하지 않기 위해 파일을 처리하는 습관의 일부 여야합니다. 그에 대한 자세한 내용은 에세이를 참조하십시오 파일 이름을 올바르게 처리하는 방법


5

find 그렇게 쉽게 :

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

산출:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

하지만 이 경우 단지 수 원하는 출력과 아무것도 등을 :

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

편집 : newlines오류 kos 가 우세하다고 말했다. 사용만으로 -exec정류합니다. 또한 /etc그러한 파일을 포함하지 않습니다.

산출:

8169

kos가 지적한대로 위 명령을 다음과 같이 줄일 수 있습니다.

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

편집 : newlines오류 kos 가 우세하다고 말했다. 사용만으로 -exec정류합니다. 또한 /etc그러한 파일을 포함하지 않습니다.

산출:

8169

4
목적은 -iname '*'무엇입니까? find기본적으로 모든 것과 일치 하지 않습니까?
스틸 드라이버

@steeldriver-이 없으면 나에게 효과가 없었습니다 '*'.
Raphael

2

사용 Z 쉘 ( zsh), 쉘의 여왕 대신 배시.

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