查找包含要打印的空格且带有引号的结果

查找包含要打印的空格且带有引号的结果

如何包含要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也是-mindepthGNU 扩展,但后来它们已被复制到其他一些实现中。如果您的实现是少数几个仍然没有它们的实现之一,您可以替换:

  • 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 {} +

答案3

您可以通过将输出管道传输到awk

find . | awk '/ /{ printf"\"%s\"\n", $0; next } { print }' 

相关内容