루프용 쉘, 파일 이름에 공백이 포함된 파일 찾기

루프용 쉘, 파일 이름에 공백이 포함된 파일 찾기

일반적인 Microsoft Windows 파일 이름을 가진 디렉터리를 생각해 보세요.

새 문서.txt
Foo.doc
푸 - copy.doc

각 파일에 대해 다음과 같은 작업을 수행하고 싶습니다.

$(find ${POLLDIR} -type f -mmin +1 -print0)의 sendfile의 경우
하다
  echo "${sendfile}"
  ls -l "${sendfile}"
  등.
  성공한 경우_위
  그 다음에
    mv "${sendfile}" "${donedir}/."
  필리핀 제도
완벽한

"${sendfile}"을 인수로 사용하여 명령 하나를 실행하고 싶지는 않습니다. 오류 검사 및 기타 작업(예: 성공 시 "${sendfile}" 이동 및 실패 시 로깅)을 수행하려면 루프가 필요합니다.

ls위의 명령 처럼 for 에서 사용할 수 있도록 find에서 파일 이름을 이스케이프/인용하는 "올바른" 구성은 무엇입니까 ? 가능하다면 임시 파일에 파일 이름을 하나씩 저장하는 것은 피하고 싶습니다.

find -printf '"%p"\n'트리플이 댓글로 물어본 문제는 아닌 것 같은데 [파일 이름에 공백이 포함된 경우 찾기를 사용하는 방법은 무엇입니까?] for foo in $(...) do생성자에서 작동합니다.

나는 이 경우에 "불법" 문자를 바꾸는 것이 나에게는 효과가 있을 것이라고 생각 ?하지만, 그것은 매우 보기 흉할 것입니다. for 루프는 결국 ${POLLDIR}의 파일을 처리한 다음 완료되면 파일을 이동하므로 "Foo bar.txt"가 "Foo-bar.txt"와 충돌할 가능성은 0(-ish)입니다.

지금까지 최선의 시도는 다음과 같습니다.

$(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?')의 sendfile의 경우
하다
  ...
완벽한

더 깨끗한 솔루션에 대한 제안이 있으십니까?

답변1

사용 find ... -print0 | while IFS="" read -d ""구성:

find "${POLLDIR}" -type f -mmin +1 -print0 | while IFS="" read -r -d "" sendfile
  do
    echo "${sendfile}"
    ls -l "${sendfile}"
    and-so-on
    if success_above
      then
        mv "${sendfile}" "${donedir}/."
    fi
done

-d ""줄 끝 문자를 null( )로 설정합니다 \0. 이 문자는 발견된 각 파일 이름을 구분하는 문자 find ... -print0이며 개행 문자가 포함된 파일 이름에도 필요합니다 . POSIX에 따라 IFS=""슬래시( ) 및 null( )만 금지됩니다. 백슬래시가 문자를 이스케이프하지 않는지 확인하세요 (예: 실제 백슬래시 뒤에 탭 문자가 아닌 문자가 오는 것과 일치)./\0-r\tt

관련 정보