unix 查找结果的自定义分隔符

unix 查找结果的自定义分隔符

我想用来find查找一些文件,并将所有文件作为单行返回(没有换行符),并在文件之间使用自定义分隔符。

例如,三个文件的结果将是

/my/file/1::/my/file/2::/my/file/3

代替

/my/file/1
/my/file/2
/my/file/3

有没有什么方法可以结合使用标准unix工具来实现这一点find

答案1

find通过和的 GNU 实现sed,您可以使用:

find . -type f -printf '%p::' | sed '$s/::$/\n/'
  • -printfGNU 的谓词将find在由 分隔的单行中打印文件名::,然后用换行符sed替换最后一行(此处未分隔)的最后一个。::

例子 :

$ find . -type f -printf '%p\n'
./foo
./test file
whose name
contains newline characters and ::
./bar

$ find . -type f -printf '%p::' | sed '$s/::$/\n/'
./foo::./test file
whose name
contains newline characters and ::::./bar

的标准等效项-printf '%p::'-exec printf '%s::' {} +.该 GNUsed表达式没有等效项,因为 POSIXsed无法处理非文本。

答案2

zsh

(){ print -r -- ${(j[::])argv}; } /my/**/*(N.)

要查找下面的所有常规非隐藏文件/my/并打印它们的路径(按词法排序,但请参阅n,oO限定符以获取替代排序顺序),j请使用::.

答案3

在许多 find 实现中都找不到 -prinf。对于这些情况,您可以使用该-exec命令实现相同的目的。

find "/some/dir" -exec echo -n {}"|" \;

echo打印每个目录条目

修饰符-n避免打印新行字符

"|"字符附加在每个条目之后

如果您的 echo 实现不支持该-n标志,很简单:

find "/some/dir" -exec printf "%s" {}"|" \;

上述内容几乎可以在任何 bash shell 中运行,包括 busybox,它存在于 OpenWRT 或 VMWare ESXi 等面向简约固件的发行版中。

(*) 请注意,最后一个示例中的 printf 调用是外部查找,而不是第一个答案中提出的查找选项。 printf 作为二进制文件几乎存在于您能想到的所有发行版中,即使是最小的发行版。

相关内容