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이는 사용하려는 항목에 따라 범위 지정 변수 및 기타 항목과 관련이 있습니다. 또한 크로스 쉘 이식성을 확장합니다. 다음 예는 bash
GNU 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 루프에서 이전에 정의한 것을 사용할 수 있음을 증명하기 위해 변수를 추가했습니다 . 두 번째 경우에는 스크립트가 그룹화에 도입된 어떤 항목에도 액세스할 수 없습니다. 그룹화에서 새 변수를 정의하고 나중에 액세스하려고 시도하여 이를 테스트할 수 있습니다. 비어 있을 것입니다. 이는 경우에 따라 첫 번째 접근 방식을 선호하는 이유가 될 수 있습니다.