如何包含要find
打印的包含空格的搜索结果''
(引号对)。仅当此结果包含空格时,如果路径字符串中没有空格,则保持原样。
答案1
find
如果您的版本支持 -printf,则可以使用以下方法来完成此操作。
find . -name "* *" -printf "\"%p\"\n" -o -print
答案2
假设您想使用 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 {} +
答案3
您可以通过将输出管道传输到awk
:
find . | awk '/ /{ printf"\"%s\"\n", $0; next } { print }'