Отображение списка имен файлов в качестве значений параметров для команды - PullRequest
1 голос
/ 15 апреля 2020

У меня есть несколько файлов, и я хочу использовать их имена в качестве аргументов команды, чтобы команда стала

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

Для каждого имени файла я хочу добавить его к имени опции. Я не знаю, сколько там файлов. Как я могу это сделать? Есть ли в bash / shell что-то похожее на map?

Файлы существуют, поэтому я могу получить имена, используя find или mayb ls, если я уверен в именах файлов, поэтому я искал для чего-то подобного вы можете сделать с xargs

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

Но вместо того, что делает xargs (превращая его в одну команду для каждого файла), я хочу одну команду со многими аргументами со вставленным <option> перед всеми именами файлов.

В моем конкретном примере c я хочу объединить неизвестное количество файлов данных покрытия одной командой:

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

Это внутри Makefile, но я ' Я предпочитаю «стандартный» подход к оболочке.

Ответы [ 5 ]

1 голос
/ 15 апреля 2020

При поиске файлов также выводится опция, используйте разделенные нулями потоки для обработки всех возможных имен файлов:

find . -maxdepth 1 -mindepth 1 -type f -printf "-a\0%p\0" | 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
1 голос
/ 15 апреля 2020

Попробуйте:

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

при условии, что в именах файлов нет специальных символов (например, пробелов).

1 голос
/ 15 апреля 2020

Вы можете сделать:

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

, добавив таким образом -optionItself перед каждым именем файла, а затем отправив его на xargs

Я уверен, что есть много других способов это должно быть выполнено, это самое простое и наиболее близкое к тому, с чем вы работаете.

0 голосов
/ 15 апреля 2020
fileslist=( $(cd /path/to/files/you/want/ ;find -maxdepth 1 -printf "%P\n" | xargs -0) )
for t in ${fileslist[@]} 
do
commandtoperform $t
done
0 голосов
/ 15 апреля 2020

может быть это?

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

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