모든 /etc
파일 의 총 줄 수를 세고 싶지만 하위 디렉토리의 파일은 계산하지 않기 때문에 다음 wc -l /etc/* | tail -1
과 같이 입력했습니다. 출력은 다음과 같습니다.
xxxx is a directory
yyyy is a directory
total 1752
내 질문은 어떻게 이러한 주석을 제거 (삭제) 할 수 있으며이 유형의 계산을 수행하는 더 좋은 방법이 있습니까?
모든 /etc
파일 의 총 줄 수를 세고 싶지만 하위 디렉토리의 파일은 계산하지 않기 때문에 다음 wc -l /etc/* | tail -1
과 같이 입력했습니다. 출력은 다음과 같습니다.
xxxx is a directory
yyyy is a directory
total 1752
내 질문은 어떻게 이러한 주석을 제거 (삭제) 할 수 있으며이 유형의 계산을 수행하는 더 좋은 방법이 있습니까?
답변:
어떤 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
일반 파일을 찾도록 지시하거나, -o
sybolic 링크 (로 표시)에 대한 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 -1
LD James의 답변 에서처럼을 사용하는 것이 더 쉽지만 find
어려운 파일 이름을 처리하지 않기 위해 파일을 처리하는 습관의 일부 여야합니다. 그에 대한 자세한 내용은 에세이를 참조하십시오 파일 이름을 올바르게 처리하는 방법
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
-iname '*'
무엇입니까? find
기본적으로 모든 것과 일치 하지 않습니까?
'*'
.