런타임에 명령 결과를 반복하는 방법

런타임에 명령 결과를 반복하는 방법

find파일을 검색하고 추가 처리를 위해 결과를 반복하는 스크립트가 있습니다 .

for file in $(find ~ -type f -size +1G); do
     filename=$(basename $file)
     echo $file
done

find명령을 직접 실행 하면 일치 항목이 직접 출력됩니다. 하지만 이 스크립트에서는 먼저 명령이 완전히 완료될 때 loop까지 기다린 다음 결과를 반복합니다.find

명령이 find일치하는 항목을 찾으면 일치 항목을 통해 루프를 실행할 수 있습니까?

output 을 사용하는 것이 가능 pipe하지만 루프에서 단순한 내용 라인보다 더 복잡한 작업을 수행하고 싶습니다.

답변1

대신 이 접근 방식을 사용하는 방법을 알아보세요.

find ~ -type f -size +1G -exec bash -c 'do-stuff-with "$1"' bash_find {} \;

find생성자에서 -exec ... {} \;find 명령을 사용하여 bash -c '...'찾은 각 파일에 대해 실행될 인라인 스크립트를 엽니다.

bash_find는 인라인 스크립트의 이름으로, 스크립트를 나타냅니다. 오류가 발생하면 스크립트가 중지되고 실패가 인쇄된 시각적 출력 과 오류에 대한 간단한 설명을 $0제공하는 데 사용됩니다 .bash_find

답변2

바라보다배쉬 FAQ/024이는 사용하려는 항목에 따라 범위 지정 변수 및 기타 항목과 관련이 있습니다. 또한 크로스 쉘 이식성을 확장합니다. 다음 예는 bashGNU null로 분리하는 경우입니다.

프로세스 대체 및 while 루프로의 리디렉션 및 인수의 null 분리:

count=0

while IFS= read -r -d $'\0' f; do
    printf "%s Processing file: %s\n" "$((++count))" "$f" 
done < <(find -type f -print0)

명령 그룹화를 사용하십시오.

count=0

find -type f -print0 |
    {
        while IFS= read -r -d $'\0' f; do
            printf "%s Processing file: %s\n" "$((++count))" "$f" 
        done
    }

count두 경우 모두 범위가 편리하고 while 루프에서 이전에 정의한 것을 사용할 수 있음을 증명하기 위해 변수를 추가했습니다 . 두 번째 경우에는 스크립트가 그룹화에 도입된 어떤 항목에도 액세스할 수 없습니다. 그룹화에서 새 변수를 정의하고 나중에 액세스하려고 시도하여 이를 테스트할 수 있습니다. 비어 있을 것입니다. 이는 경우에 따라 첫 번째 접근 방식을 선호하는 이유가 될 수 있습니다.

관련 정보