2011-11-17 5 views
1

각각 하나의 (정수) 숫자가 들어있는 파일 집합이 있는데, 이는 같은 이름의 디렉토리에있는 파일 수 (.txt 접미어 제외)입니다. 각 디렉토리에 wc이 있습니다.고양이 숫자가 bash 숫자 변수로 출력

파일의 숫자를 합하여 싶습니다. 나는 시도했다 :

i=0; 
find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do i=$i+`cat $j.txt`; done 
echo $i 

그러나 대답은 0입니다 만약 내가 단순히 echocat의 출력 :

i=0; find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do echo `cat $j.txt`; done 

값이 있습니다 :

1313 
1528 
13465 
22258 
7262 
6162 
... 

아마도 I가있다 어떻게 든 cat의 출력을 캐스팅 하시겠습니까?

[편집]

나는 결국 내 자신의 솔루션을 발견했다

:

i=0; 
for j in `find -mindepth 1 -maxdepth 1 -type d -printf '%f\n'`; do 
    expr $((i+=$(cat $j.txt))); 
done; 

28000 
30250 
... 
... 
647185 
649607 

을하지만이 방법

답변

4

방법 당신에게 함께 출력을하지 않는 한 허용 대답은 깔끔 cat의 출력 합계가 작동합니다. 그러나 while 루프가 서브 쉘에서 실행 중이기 때문에 0이 발생하므로 루프가 끝나면 합계를 저장하는 변수가 범위를 벗어납니다. 자세한 내용은 BashFAQ/024을 참조하십시오.

여기 process substitution (대신 파이프)를 사용하여 그것을 해결하는 한 방법입니다 :

SUM=0 
while read V; do 
    let SUM="SUM+V" 
done < <(find -mindepth 1 -maxdepth 1 -type d -exec cat "{}.txt" \;) 

주 내가 찾기/고양이/합 연산을 변경하는 자유를 촬영했습니다,하지만 당신의 접근 방식은 잘 작동합니다 게다가. 발견의 필요없이

+0

! 물론 – tdc

+0

아 .. 물론 세미콜론이 필요했습니다. 물론. 오타가 수정되었습니다. –

1

내 한 줄 솔루션 : 덕분에 그것을했다

echo $(($(printf '%s\n' */ | tr -d/| xargs -I% cat "%.txt" | tr '\n' '+')0)) 
+0

찾기를 사용하지 않을 경우 어떤 이점이 있습니까? – tdc

+0

find 대신 findf를 사용하는 것이 더 빠릅니다. –

관련 문제