将文件名列表映射为命令的选项值
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
我有很多文件,想用它们的名字作为命令的参数,这样命令就变成了
<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