将文件名列表映射为命令的选项值

Map list of filenames as option values for command

我有很多文件,想用它们的名字作为命令的参数,这样命令就变成了

<command> <option> <file1> <option> <file2> ...

对于每个文件名,我想在其前面加上选项名称。我不知道有多少文件。我怎样才能做到这一点? bash/shell 有没有类似于 map 的东西?

文件存在,所以我会使用 find 获取名称,或者如果我确定文件名,则可能 ls,所以我正在寻找可以使用 xargs

ls -1q <pattern> | xargs <command> ...

但是我想要一个带有许多参数的单个命令,而不是 xargs 做的事情(将其变成每个文件的一个命令),并在所有文件名之前插入 <option>

在我的具体示例中,我想用一个命令组合未知数量的覆盖率数据文件:

lcov -o total.coverage -a <file1> -a <file2> ... 

这是在 Makefile 中,但我更喜欢 "standard" shell 方法。

你可以这样做:

ls <pattern> |sed "s/^/-optionItself /g"|xargs

因此在每个文件名前附加-optionItself,然后发送给xargs

我相信还有很多其他方法可以实现这一点,这是最简单且最接近您工作的方法。

也许是这个?

function multi_lcov(){
  files_params=($@)
  lcov ${files_params[@]}
}

multi_lcov "$(ls | sed -r 's/(.*)/\-a /g')"

试试这个:

files=(pattern)
# This will expand the [pattern], and put all the files in [files] variables

lcov -o total.coverage ${files[@]/#/-a }
# ${files[@]/#/-a } replaces the beginning of each element in files with [-a ],
# meaning prepend [-a ]
# For more information, see section [${parameter/pattern/string}] in
# https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

假设您的文件名中没有特殊字符(如空格)。

虽然查找文件也会打印选项,但使用零分隔流来处理所有可能的文件名:

find . -maxdepth 1 -mindepth 1 -type f -printf "-a[=10=]%p[=10=]" | xargs -0 lcov -o total.coverage

与作为列表元素分隔符的换行符相同:

find . -maxdepth 1 -mindepth 1 -type f -printf "-a\n%p\n" | xargs -d '\n' lcov -o total.coverage
fileslist=( $(cd /path/to/files/you/want/ ;find -maxdepth 1 -printf "%P\n" | xargs -0) )
for t in ${fileslist[@]} 
do
commandtoperform $t
done