for
이전 프로세스에서 가져온 입력 범위를 사용하여 Linux mint에서 Bash 명령을 사용하여 루프 프로세스를 수행했지만 범위를 명시적으로 직접 지정하고 터미널 출력을 제공하기 위해 실행하는 find
대신 터미널 출력을 기준으로 일괄 처리로 수행된 것으로 보입니다 find
. 내 것은;
IFS=$'\n'
for s in $(find ~+ -type f -regextype posix-extended -iregex ".*/data\.(tmp|bak)" -printf '%p\n')
{
echo $s
}
아무런 출력 없이 100초 동안 정지 상태를 유지합니다. 또는 일부를 터미널에 직접 표시하는 대신. find
직접 지시하는 것만큼 빠르게 작동하게 하려면 어떻게 해야 합니까 ? 미리 감사드립니다.
답변1
루프 for
는 하나를 반복합니다.변화 없는항상 목록을 작성합니다. 따라서 반복할 항목이 완전히 지정될 때까지 질문의 루프 본문은 실행을 시작하지 않습니다. find
이는 명령 실행이 완료될 때까지 완전히 지정되지 않습니다 .
명령에 몇 가지 문제가 있으며 대부분은 질문으로 "해결"할 수 있습니다.찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?".
find
일반적으로 내부 스크립트의 경로 이름 생성기 로 작동하는 것이 더 좋습니다 .
find ~+ -type f \( -iname data.tmp -o -iname data.bak \) -exec sh -c '
for pathname do
# process "$pathname" here
done' sh {} +
find
이렇게 하면 루프에 제공되는 경로 이름이 어떻게 구분되는지 신경 쓸 필요가 없습니다 (이렇게 하면 공백과 개행 등이 포함된 경로 이름이 정상적으로 처리됩니다).
관련된: