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

时间:2015-03-16 17:01:08

标签: bash shell unix

我想从标准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 个答案:

答案 0 :(得分:10)

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

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

如果文件名不包含空格,则另一种方法是:

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

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

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

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

答案 1 :(得分:3)

这也可以:

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

答案 2 :(得分:2)

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

蟒:

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

perl的:

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

答案 3 :(得分:2)

这是一个不管道输出的替代方案:

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

答案 4 :(得分: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