루프가 각 프로세스가 완료될 때까지 기다리도록 'while'을 보다 적절한 함수로 바꾸세요.

루프가 각 프로세스가 완료될 때까지 기다리도록 'while'을 보다 적절한 함수로 바꾸세요.

여러 하위 폴더에서 파일을 재귀적으로 찾은 다음 각 파일을 사용하는 bash 스크립트가 있습니다 ffmpeg. 디버깅할 때 사용하면 훌륭하게 작동 echo ffmpeg하지만 문제는 실제로 ffmpeg사용하고 각 비디오가 완료될 때까지 기다리는 데 30분이 걸리고 bash 스크립트가 ffmpeg각 파일에 대해 성공적으로 실행되지 않는다는 것입니다.

내 스니펫은 다음과 같습니다.

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' ! -name '*-[900p].mkv' \) -print |
while IFS= read file    ## IFS= prevents "read" stripping whitespace
do
    ffmpeg -i "$file" "$target" && rm -rf "$file"
done

문제는 ffmpeg가 응답하는 데 너무 오래 걸리고 while계속 나열하고 실행하기 때문입니다. 그렇다면 루프가 done끝난 후에 만 루프가 처리되도록 할 수 있는 방법이 있기를 바랍니다 .

누구든지 도와줄 수 있나요? 감사해요!

OMG, 왜 내 다른 질문과 중복될 수 있는지 표시되어 있는지 모르겠습니다.내 스크립트가 재귀적으로 적용될 수 있도록 "for file in"을 "find"로 변환하세요.

다음 개체를 반복하기 전에 루프 내의 각 함수가 완료될 때까지 bash 스크립트가 기다릴 수 있도록 하는 루프 작업을 요청합니다. 이는 재귀적으로 보관하는 방법을 묻는 것과는 거리가 멀습니다 find. 감사해요!

답변1

find를 루프로 파이프하는 대신 중간 파일을 반복할 수 있습니다. 이렇게 하면 찾기 단계와 루프 단계가 순차적으로 발생하고 겹치지 않게 됩니다. 다음과 같습니다(간결하게 표현을 변경했습니다).

find \( -name '*.mkv' -o -name '*avi' \) >files
<files while IFS= read file
do
    ffmpeg -i "$file" "$target" && rm -f "$file"
done

이는 여전히 완전히 안전하지는 않습니다. find -exec요구 사항에 find첫 번째 호출 전에 엄격하게 실행하는 것이 포함되지 않은 경우 사용하는 것이 더 간단합니다 ffmpeg. 이 요구 사항에 따라 find -print0xargs 또는 GNU 병렬을 사용하면 작업이 수행됩니다.

답변2

코드가 제대로 작동하지 않는 이유는 find초기 명령의 AND 및 OR 그룹이 일치하지 않기 때문입니다.

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' ! -name '*-[900p-by-ZiriusPH].mkv' \) -print

매개변수 바인딩은 일치하는 파일을 인쇄하는 것입니다.

  • 이름*.mkv
  • 또는 이름*.avi
  • 또는 이름*mp4
  • 또는 이름*flv
  • 또는 이름*.ogg
  • 또는 이름*.ogg
  • 또는 (이름 *.mov 및 이름이 아님 *-[900p-by-ZiriusPH].mkv )

마지막 조건은 많은 파일에 적용되는데, 이는 귀하가 원하는 것이 아닐 것으로 생각됩니다. AND NOT 조건을 대괄호로 묶은 OR 조건 밖으로 이동하면 예상대로 작동하는 것을 확인할 수 있습니다.

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! -name '*-[900p-by-ZiriusPH].mkv' -print

관련 정보