공백이 포함된 파일 이름을 가진 find가 있는 쉘 for 루프

공백이 포함된 파일 이름을 가진 find가 있는 쉘 for 루프

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

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

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

$(find ${POLLDIR} -type f -mmin +1 -print0)의 sendfile에 대해
하다
  에코 \"${sendfile}\"
  ls -l "${sendfile}"
  등등
  성공_위인 경우
  그 다음에
    mv "${sendfile}" "${donedir}/."
  fi
완료

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

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

find -printf '"%p"\n'나는 질문에 대한 의견에서 Triplee이 제안한 것처럼 그렇게 생각하지 않습니다 .파일 이름에 공백이 포함되어 있으면 어떻게 find를 사용합니까?] 구성에서 작동합니다 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개행 IFS=""문자가 포함된 파일 이름을 사용하는 데에도 필요합니다. POSIX에 따르면 슬래시( /) 및 null( \0)만 금지됩니다. 는 -r백슬래시가 문자를 이스케이프하지 않도록 보장합니다( \t예를 들어 실제 백슬래시 뒤에 탭 t이 아닌 탭이 오는 것과 일치함).

관련 정보