如何在Unix系统中查找所有文件并用逗号分隔结果?

10

我希望从标准的find输出转换为:

path/to/file1.yaml
path/to/file2.yaml
path/to/file3.yaml

变成这样:

path/to/file1.yaml,path/to/file2.yaml,path/to/file3.yaml

从命令行中最简单的方法是什么?

我已经尝试过以下方法:

find . -path '*.yaml' | sed -e 's/\s/,/g'
find . -path '*.yaml' -print0 | sed -e 's/ /,/g'

但似乎没有起作用。

5个回答

14

以下是一种使用逗号分隔文件名的方法:

find . -path '*.yaml' | tr '\n' ','

如果文件名不包含空格,则可以尝试另一种方法:

IFS=, echo $(find . -path '*.yaml')

在评论中,Kojiro 提出了一种保留空格的第三种方法:

find . -path '*.yaml' -print0 | tr '\0' ,

由于文件名允许换行符和逗号,因此这种格式可能会导致混淆。只有当您知道您的文件名称合理时,才应使用此格式。


1
你可以使用 find . -path '*.yaml' -print0 | tr '\0' , 来避免空格混淆。 - kojiro
@kojiro 很好。我已将其添加到答案中。 - John1024

12

这也能起作用:

  find . -path '*.yaml' | paste -s -d ',' -

3
找到所有.yaml文件:find . -path'*.yaml' | paste -sd, - teichert
4
我喜欢这种方法不会像“tr”和“print”那样产生尾随逗号。 - junvar

3
无论是Python还是Perl都可以只用一行代码来实现:

Python:

find . -path '*.yaml' | python -c 'import sys; print ",".join(sys.stdin.readlines())'

Perl:

find . -path '*.yaml' | perl -e 'print join ",", map {chomp;$_} <STDIN>'

3

这里有一个不需要管道输出的替代方案:

 find . -name "*.yaml" -printf "%p,"

这包括最后一个文件后面的逗号。但是去掉它很容易;sed 's/,$//' - tripleee
这是真的,我忘记了尾随逗号。 - Daniel Haley
请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本或将其捕获到变量中并执行操作,以避免分叉短期进程: ${output%,} - Jason Hu

0
Globstar 是 bash 4+ 版本中备受低估的功能。许多 shell 支持类似的功能。
shopt -s globstar
f=( **/*.yaml )
IFS=,
echo "${f[*]}"

如果你想避免重置IFS,可以使用子shell或函数:

join() {
  local IFS="$1"
  shift
  printf '%s\n' "$*"
}
join , **/*.yaml

或者:IFS=,eval 'printf"%s\n"${f[*]}' 或将其保存在辅助变量中:IFS=,eval 'csv="${f[*]}"' - gniourf_gniourf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接