2014-10-06 3 views
0

디렉토리 내의 파일에서 총 행을 계산하려고합니다. 이렇게하려면 find와 wc의 조합을 사용하려고합니다. 그러나 find . -exec wc -l {}\;을 실행하면 find: missing argument to -exec 오류가 나타납니다. 나는 명백한 문제, 어떤 아이디어도 볼 수 없습니까?find -exec가 인수를 인식하지 못합니다.

+5

공간을 찾지 못했습니다. '찾기. -exec wc -l {} \;'('\;'앞에 공백). –

+0

나는 영리한 사람이 아니다. – ragingSloth

답변

4

당신은 단순히 현재 위치에서 하위 디렉토리가있는 경우, wc 그런 식으로 뭔가를 보이는 그들 각각에 대한 오류 메시지를 생성합니다

find . -exec wc -l {} \; 

{} 사이 \; 공간이 필요합니다 :

wc: ./subdir: Is a directory 

이 문제를 방지하려면, 당신은 파일에 대한 검색을 제한 할 find에게 할 수 있습니다 :

find . -type f -exec wc -l {} \; 

다른 메모 : -exec 옵션을 사용하는 것이 좋습니다. 너무 많은 시간 사람들이 관이 함께 같은 결과를 얻을 생각을 명령, 여기에서 예를 들면 그것은 다음과 같습니다하는 방식으로 배관 명령을

find . -type f | xargs wc -l 

문제는 모든 파일이 공백이있는 경우는 휴식이다. 예를 들어 파일 이름이 "a b"인 경우 wc은 "a"와 "b"를 따로 받고 두 개의 오류 메시지 (a: no such fileb: no such file)를 받게됩니다.

파일 이름에 공백이 없거나 인쇄 할 수없는 문자가 있다는 것을 알지 못하는 경우 명령을 함께 파이프해야하는 경우 모두 함께 파이핑하는 도구를 지정해야합니다 NULL 문자 (\ 0)를 공백 대신 구분 기호로 사용합니다. 그래서 이전 명령이 될 것입니다 : 버전 4.0 이상 bash의와

find . -type f -print0 | xargs -0 wc -l 
+0

POSIX는'; ''(또는'\;') 대신'+'를 사용하는 것이'xargs'를 사용하는 것과 거의 비슷하게 작동한다고 규정했다. 'find'는 N 개의 파일 이름 (N은 제어 가능한 양이 아니라 인수리스트의 최대 길이와 파일 이름의 길이에 달려 있음) 당 한 번 명령을 실행하기 위해 여러 파일 이름을 그룹화합니다. –

1

, 당신은 전혀 find 명령을 필요가 없습니다

는, 디렉토리를 건너 뛸 수있는 간단한 방법은 없습니다
shopt -s globstar 
wc -l **/* 

하는 등 Gui Rava가 지적한대로 파일과 디렉토리를 이름만으로 구분할 수 없다면 말입니다. 예를 들어, 디렉토리의 이름에 .이 없어도 모든 파일에는 하나 이상의 확장자가있을 수 있습니다.

wc -l **/*.* 
관련 문제