Find

查找包含要列印的空格的結果,並帶有引號

  • October 29, 2020

包含空格的搜尋結果如何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 . -print0find . -exec printf '%s\0' {} +
  • find . -mindepth 1 -printf '%P\0'find . ! -name . -exec sh -c 'for i do printf "%s\0" "${i#./}"; done' sh {} +

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