我想从标准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'
但似乎不起作用。
以下是用逗号分隔文件名的一种方法:
find . -path '*.yaml' | tr 'n' ','
如果文件名不包含空格,则另一种方法是:
IFS=, echo $(find . -path '*.yaml')
在评论中,Kojiro提出了保留空格的第三种方法:
find . -path '*.yaml' -print0 | tr ' ' ,
由于文件名中允许使用换行符和逗号,因此此格式可能会导致混淆。仅当您知道您的文件已合理命名时,才应使用此格式。
这也
行得通:
find . -path '*.yaml' | paste -s -d ',' -
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>'
下面是一个不通过管道传输输出的替代方法:
find . -name "*.yaml" -printf "%p,"
Globstar是bash 4+的一个被严重低估的功能。一些外壳支持类似的功能。
shopt -s globstar
f=( **/*.yaml )
IFS=,
echo "${f[*]}"
如果要避免重置IFS
,请使用子 shell 或函数:
join() {
local IFS="$1"
shift
printf '%sn' "$*"
}
join , **/*.yaml