Существует два основных способа преобразовать поток вывода в список аргументов. Быстрое (и иногда грязный) способ сделать это с xargs
. По умолчанию это принимает стандартный входной поток и выполняет команду с каждой строкой входа как отдельный аргумент. Необходимо всегда быть осторожны относительно формата входа, потому что пробелы и другие символы легки к misinturpret при передаче как аргументы. Имена пакета, однако, являются relativly сейфом. Они не должны включать подстановочные символы оболочки или новые строки или что-либо сумасшедшее, таким образом, вот то, на что оно было бы похоже для Вашей команды: [3]
$ pkg_info | grep proto | sed 's/\([a-z0-9]*\).*/\1/' | xargs pkg_deinstall -n
Частый случай - то, что на самом деле необходимо выполнить команду однажды для каждой обрабатываемой строки. В этом случае -n
аргумент пригождается. Можно использовать -n1
выполнять их по одному, или даже -n10
выполнять их в пакетах десять.
$ [pipline] | xargs -n1 pkg_deinstall -n
Теперь скажем, у Вас есть потребность добавить другой аргумент после автоматически сгенерированный однажды. В этом случае можно использовать '-I' для определения строки для замены автоматически сгенерированными аргументами. Это также позволит Вам делать, вещам нравится, заключают аргумент в кавычки при необходимости. Можно затем отформатировать, куда аргументы будут помещены как это: [1] [2]
$ [pipline] | xargs -n1 -I{} pkg_deinstall -n "{}" --trailing-argument
Если бы Вы хотели больше управления или выполнять несколько команд для каждой строки входа, то Ваша следующая опция состоит в том, чтобы использовать цикл как это:
$ [pipline] | while read line; do
echo "Uninstalling $line..."
pkg_deinstall -n "$line"
done
Обратите внимание что pkg_deinstall
автоматически использует выражение в качестве частичного шарика соответствия, так быть осторожным относительно того, что Вы передаете, чтобы быть удаленными. Передача базового имени некоторого компонента системы удалит не только, что компонент, но и все, что имеет имя как он или зависит от него! Это могло быть катастрофически, поэтому всегда тщательно проверяют Ваш набор пакета. Можно использовать -n
сделать пробный прогон, который показывает то, что обошлось бы без фактическое выполнение его [3] и/или -i
выполнять каждый шаг в интерактивном режиме.
[1] Я использовал {}
поскольку, потому что находят и другие подобные исполнительные функции используют этот формат, но любая уникальная строка сделает.
[2] pkg_deinstall
команда не имеет никаких аргументов, которые прибыли бы после шаблона, таким образом, это - пример только!
[3] Я добавил -n
все мои примеры так, чтобы, если Вы копируете и вставляете код, это ничего на самом деле не делало, просто покажите Вам тестовый прогон.
cp
и mv
и хорошие инструменты для копирования файлов и движущиеся файлы соответственно. Объединенный с конструкциями оболочки (циклы как for file in *; do ...; done
) или find
, они становятся еще более мощными.
Если я понял Вашу цель правильно, Вы извлекли файлы как:
somedir/file.png
somedir/file.txt
и хочу переместить все файлы в родительский каталог, таким образом, что он похож:
file.png
file.txt
Используя подстановочные знаки оболочки, предполагая, что Вы находитесь в каталоге somedir
, можно использовать:
mv * ../
*
шаблон шарика, который расширяется до всех файлов в текущем каталоге. Если у Вас есть скрытые файлы (файлы и каталоги с продвижением .
в их имени файла), использовать shopt -s dotglob
в bash
).
Я упомянул find
прежде. Если у Вас есть дерево файлов как:
somedir/000.txt
somedir/a/001.txt
somedir/a/004.txt
somedir/b/003.txt
somedir/b/002.txt
somedir/whatever/somethingunique.txt
и хочу переместиться, все файлы в одном каталоге (скажите, seconddir
), используйте:
find -exec mv {} seconddir/ \;
Это предполагает, что все имена файлов уникальны, иначе файлы перезаписать.
Вы могли бы уйти приятно с, переименовывают, поскольку это более склонно к пакетной обработке.