2013-09-30 2 views
1

리눅스에서 모든 디렉토리와 서브 디렉토리를 반복하고 모든 텍스트 파일을 cat하는 쉘 스크립트를 작성하고 싶습니다. 아래는 제가 지금까지 가지고있는 것입니다. 누군가 내게 손을 줄 수 있습니까? 감사리눅스 셸 스크립트 파일과 디렉토리 루프

스크립트는 1 개 인수를 예 : ./script.sh이 DirectoryName

#!/bin/bash 

echo "Directory $1" 

cd $1 
for f in *.txt 
do 
cat $f 
done 

메신저 각 하위 디렉토리에 무한대가 될 수있는, 여기에서 하위 디렉토리로 이동하는 방법을 확실.

답변

4

find을 사용하십시오.

운영 체제가 POSIX의 현대 버전을 지원하는 경우 : 당신이 원하는 경우,

find "$1" -type f -name '*.txt' -exec cat '{}' ';' 

... 나 : 그렇지 않은 경우,

find "$1" -type f -name '*.txt' -exec cat '{}' + 

을 ... 또는 비효율적 인 (또는 더 흥미로운 사용 사례가 당신에 대해 이야기하지 않은 경우), 그리고 find은 ... -print0 지원

find "$1" -type f -name '*.txt' -print0 | \ 
    while IFS='' read -r -d '' filename; do 
    cat "$filename" 
    done 

-print0을 제외하지 마십시오. 그렇지 않으면 악의적으로 이름이 지정된 파일 (이름에 개행 문자가 있음)이 스트림에 임의의 이름을 주입하거나 (최악의 경우) 처리에서 숨길 수 있습니다.

+0

print0은 무엇입니까? – NewFile

+0

@NewFile,'-print0' NUL은 개행 문자로 구분하지 않고 이름을 구분합니다. –

+0

폴더 이름? $ 1 -type -f -name '* .txt'-exec cat '{}'+ –

2

find 또는 재귀를 사용할 수 있습니다.

예 사용하여 재귀 :

for f in $(find . -name *.txt);do 
    cat $f 
done 
+0

나는 정확히 당신이 쓴 것을했지만, 줄 주위에 문법 오류가 있었다. – NewFile

+0

그래, 내가 쓴 것은 구문 오류가 있지만 @JohnKugelman은 그것을 고쳤다. –

0

변화 루프는, 디렉토리의 전체 경로로 .를 교체합니다. find은 확장자가 .txt 인 파일을 가져오고 cat 명령을 실행하는 xargs으로 파이프합니다. -0 옵션 xargs은 그대로 입력을받습니다. -print0 모드가 적합합니다 ...

+0

-1; 이것은 적극적으로 해를 끼치거나 버그를 만듭니다. http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29를 참조하십시오 (확장에 대한 인용 부호가 부족한 것 이외에) –

+0

원래 코드와 동일한 문제가 발생했습니다 : f에 대한 * .txt – michael501

+0

오류. 'for f * * .txt'는 안전합니다. 링크 된 페이지를 읽으십시오. –

2
find . -name '*.txt' -print0 | xargs -0 cat 

특정 디렉토리를 원하는 경우와

dump_files() 
{ 
    for f in $1/*; do 
     if [[ -f $f ]]; then 
      cat $f 
     elif [[ -d $f ]]; then 
      dump_files $f 
     fi 
    done 
} 
+0

만약'-print0'을 찾기에 충분하다면,'-exec {} +'형식 (xargs처럼 가능한 많은 수의 인수를 각'cat' 명령 줄에 넣으십시오)을 사용하십시오. –

+0

당신과 동의하지 마세요, @CharlesDuffy. 나는 다른 선택을하고 있었어. 그게 전부입니다. – iamauser

관련 문제