일반적인 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
\t
t