Find
查找包含要列印的空格的結果,並帶有引號
包含空格的搜尋結果如何
find
用封閉''
(引號對)列印。僅當此結果包含空格時,如果路徑字元串中沒有空格,則保持原樣。
find
如果您的版本支持 -printf ,這是一種使用方法。find . -name "* *" -printf "\"%p\"\n" -o -print
假設您想使用 GNU 工俱生成 CSV 輸出:
find . -print0 | LC_ALL=C sed -z '/[",[:space:]]/{s/"/""/g; s/.*/"&"/}' | tr '\0' '\n'
也就是說,只要文件名包含至少一個
"
,,
或 ASCII 空白字元(包括但不限於 SPC、TAB、CR 和換行符,都是 CSV 中的特殊字元),就轉換"
為""
(大多數 CSV 格式如何轉義"
s ),並用雙引號將字元串括起來。這部分是使用 NUL 作為記錄分隔符完成的,因為它是文件路徑中唯一不能出現的字節。然後,我們將 NUL 轉換為換行符
tr
。在非 GNU 系統上,您總是可以求助於
perl
:find . -print0 | perl -l -0 -pe 'if (/[",\s]/) {s/"/""/g; $_ = "\"$_\""}'
後
touch 'a b' $'a\nb' a,b a_b $'a\200b' 'a"b'
他們給:
. "./a""b" ./a_b "./a,b" ./a�b "./a b" "./a b"
(
�
我的終端對\200
在我的 UTF-8 語言環境中不形成有效字元的字節的再現在哪裡)。要排除
.
和./
前綴,請替換-print0
為-mindepth 1 -printf '%P\0'
(儘管-printf
是 GNU 特定的)。這使:"a""b" a_b "a,b" a�b "a b" "a b"
-print0
並且-mindepth
也是 GNU 擴展,但它們已被複製到其他一些實現中。如果您的實現是少數仍然沒有它們的實現之一,您可以替換:
find . -print0
和find . -exec printf '%s\0' {} +
find . -mindepth 1 -printf '%P\0'
和find . ! -name . -exec sh -c 'for i do printf "%s\0" "${i#./}"; done' sh {} +