2016-02-15 3 views
1

Я на Ubuntu 14.04. Допустим, в папке имеется неизвестное количество исполняемых файлов.Как использовать результат поиска для одного xargs

ATest, BTest, CTest 

Я хочу выполнить каждый исполняемый файл с помощью параметра командной строки, связанного с его именем. Например,

valgrind --xml=yes --xml-file=ATest.log ./ATest 
valgrind --xml=yes --xml-file=BTest.log ./BTest 
valgrind --xml=yes --xml-file=CTest.log ./CTest 

я могу получить исполняемые файлы с помощью

find . -executable -type f 

я могу получить аргумент пользовательской командной строки с помощью

find . -executable -type f -printf '%f\n' 

я могу сделать

find . -executable -type f | xargs -n 1 valgrind --xml=yes --xml-file=Test.log 

но к сожалению, имя файла журнала i s не настроен. Я попытался объединить его, как показано ниже, но это не сработало

find . -executable -type f -printf '%f\n' && find . -executable -type f | xargs -n 2 valgrind --xml=yes --xml-file={}.log 

Что такое правильный способ объединения результатов двух находкой для одного xargs?

ответ

1

Вы можете использовать:

find . -executable -type f -printf '%f\n' | 
xargs -I {} valgrind --xml=yes --xml-file={}.log ./{} 

Или это xargs:

find . -name '*Test' -executable -type f -print0 | 
xargs -0 -I {} bash -c 'valgrind --xml=yes --xml-file="${1##*/}.log" "$1"' - {} 

Это будет выполнять эти 3 команды:

valgrind --xml=yes --xml-file=ATest.log ./ATest 
valgrind --xml=yes --xml-file=BTest.log ./BTest 
valgrind --xml=yes --xml-file=CTest.log ./CTest 
+0

Как бы вы обходились, если это нужно выполнить в более высоком каталоге, что означает, что «find. -executable -type f» возвращает ./dir/ATest ./dir/BTest ./dir/CTest? – user3667089

+0

Это работает, но проблема с использованием find всегда возвращает 0 (echo $?), Даже если программа терпит неудачу. Можно ли использовать xargs? – user3667089

+1

работает феноменально! – user3667089

0

Использование xargs «s -I переключатель:

[email protected]:~/tmp$ ls 
a b c 
[email protected]:~/tmp$ find . -type f -printf '%f\n' | xargs -IXXX echo XXX some more stuff -f XXX and more XXX 
a some more stuff -f a and more a 
c some more stuff -f c and more c 
b some more stuff -f b and more b 
+0

Как вы показываете что-то вроде ./a еще несколько вещей a.log? Другими словами, путь, разделенный на имя файла журнала. – user3667089

+0

Я обновил свой ответ, чтобы показать, как это сделать. –

Смежные вопросы