2016-08-10 2 views
0

저는 스크립팅/프로그래밍/모든 것을 처음 접했고이 bash 스크립트/루프를 알아낼 수 없습니다. 반복하려고합니다.bash에서 중첩 된 for 루프가 제대로 반복되지 않습니까?

I는 각 내가 (지금은) 에코하고자하는 파일 I이이

를 포함하는 많은 서브 디렉토리가, "폴더"라는 디렉토리를 가지고 있지만, 인쇄하지 않는 것 파일을 서브 디렉토리 내에서 인쇄하지만 대신 서브 디렉토리 자체를 인쇄합니다. 이 작업을 수행하기 위해 스크립트를 어떻게 변경합니까?

for directory in *; 
do 
     for thing in $directory 
     do 
       echo $thing 
     done 
done 
+2

는'$ {디렉토리}/*를'싶지 않아? 또는 perphaps'(cd "$ directory"; *에있는 것에 대해서는 echo $ thing; done;)'. – Droppy

답변

3

for 루프 자체는 파일 시스템을 통과하지 않습니다. 그것은 일련의 문자열에 대해서만 반복합니다. 두 번째 루프의 경로 이름 확장 결과를 반복해야합니다.

for directory in *; 
do 
    for thing in "$directory"/* 
    do 
     echo "$thing" 
    done 
done 

당신은 더 복잡한 패턴으로 하나 개의 루프이 작업을 수행 할 수 있습니다

for thing in */*; do 
    echo "$thing" 
done 
+0

no loop에 의해,'some_command */*'와 같은 것을 의미합니까? 내부 루프의 본문이 하나의 내장 명령보다 복잡하다고 가정합니다.이 경우 큰 일치 집합에 문제가 있습니다. – chepner

1

배쉬 버전 4.0이 설정되어 다른 패턴 ** 취급 globstar라는 새로운 글 로빙 옵션을 추가합니다.

#!/bin/bash 
shopt -s globstar 
for file in folder/** # with '**' bash recurses all the directories 
do 
    echo "$file" 
done 
+1

어레이는 관련이 없으며 메모리에 드레인 가능성이 있습니다. 당신은 패턴을 직접 반복 할 수 있습니다. (나는 생각합니다) 전체 일치를 메모리에 저장할 필요가 없습니다. – chepner

+0

@chepner : 잘 지적했습니다! 변경됨 – sjsam

관련 문제