일반적인 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
이 아닌 탭이 오는 것과 일치함).