Shell-Script

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

  • December 18, 2020

考慮一個具有典型 Microsoft Windows 文件名的目錄:

新建文件.txt
Foo.doc
Foo - Copy.doc

我想對每個文件做一些事情,例如:

對於 $(find ${POLLDIR} -type f -mmin +1 -print0) 中的發送文件
做
迴聲 \"${發送文件}\"
ls -l "${發送文件}"
等等
如果success_above
然後
mv "${sendfile}" "${donedir}/."
是
完畢

請注意,我不想只執行 1 個帶有 " 的命令 $ {sendfile}" as the argument. I need the loop to do error checking and other things (like moving " $ {sendfile}" 成功和登錄失敗)。

什麼是從 find 中轉義/引用文件名的“正確”構造,以便我可以在 for 中使用它們,就像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 ' ' '?') 中的發送文件
做
...
完畢

有什麼更清潔的建議嗎?

使用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的反斜杠後跟 a而不是製表符)。-r``\t``t

引用自:https://unix.stackexchange.com/questions/160231