shell for 循环,查找文件名包含空格的文件

shell for 循环,查找文件名包含空格的文件

考虑一个具有典型 Microsoft Windows 文件名的目录:

新建文档.txt
Foo.doc
Foo - 副本.doc

我想对每个文件做一些事情,例如:

对于 $(find ${POLLDIR} -type f -mmin +1 -print0) 中的 sendfile
  回显“${sendfile}”
  ls -l "${sendfile}"
  等等
  如果成功_以上
  然后
    mv "${sendfile}" "${donedir}/."
完毕

请注意,我不想只运行 1 个以“${sendfile}”作为参数的命令。我需要循环来进行错误检查和其他操作(例如在成功时移动“${sendfile}”并在失败时记录)。

什么是“正确”的构造来转义/引用 find 中的文件名,以便我可以在 for 中使用它们,就像ls上面的命令一样?如果可能的话,我想避免将文件名一一存储在临时文件中。

我不认为这find -printf '"%p"\n'是 Triple 在评论中提出的问题 [当文件名包含空格时如何使用 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匹配实际的反斜杠后跟 at而不是制表符)。

相关内容