Bash 如何在Unix上通过逗号查找所有文件和单独的结果?

Bash 如何在Unix上通过逗号查找所有文件和单独的结果?,bash,shell,unix,Bash,Shell,Unix,我想从标准的查找输出,它是: 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/ /,

我想从标准的
查找
输出,它是:

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'

但似乎不起作用。

这里有一种用逗号分隔文件名的方法:

find . -path '*.yaml' | tr '\n' ','
如果文件名不包含空格,则另一种方法是:

IFS=, echo $(find . -path '*.yaml')
在评论中,提出了第三种保留空白的方法:

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

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

python和perl都可以在一行中完成此操作:

python:

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

find-路径“*.yaml”| perl-e“print join”,“,映射{chomp;$}”

这里有一个不通过管道传输输出的替代方案:

 find . -name "*.yaml" -printf "%p,"
这也会起作用:

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

Globstar是Bash4+的一个被高度低估的特性。有几个shell支持类似的功能

shopt -s globstar
f=( **/*.yaml )
IFS=,
echo "${f[*]}"
如果要避免在IFS
中重置
,请使用子shell或函数:

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

但是,在最后一个文件之后包含最后一个逗号。但消除这一点很容易
sed的/,$/'
没错,我忘了后面的逗号。或者将它捕获到一个变量并执行操作以避免出现短期过程:
${output%,}
。您可以避免与
find混淆空格-路径'*.yaml'-print0 | tr'\0',
@kojiro-Excellent。我将它添加到了答案中。或者:
IFS=,eval'printf“%s\n”“${f[*]}”
或者将它保存在一个辅助变量中:
IFS=,eval'csv=“${f[*]}”
。也允许使用略短的版本:
find-路径“*.yaml”| paste-sd,
我喜欢它不会像
tr
print
方法那样产生尾随逗号。
join() {
  local IFS="$1"
  shift
  printf '%s\n' "$*"
}
join , **/*.yaml