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而不是製表符)。

相關內容