Shell-Script
shell for 循環,查找文件名包含空格
考慮一個具有典型 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