Файлы копирования/перемещения пакета в Unix?

Существует два основных способа преобразовать поток вывода в список аргументов. Быстрое (и иногда грязный) способ сделать это с 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 все мои примеры так, чтобы, если Вы копируете и вставляете код, это ничего на самом деле не делало, просто покажите Вам тестовый прогон.

4
06.05.2012, 20:28
2 ответа

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/ \;

Это предполагает, что все имена файлов уникальны, иначе файлы перезаписать.

5
27.01.2020, 20:54

Вы могли бы уйти приятно с, переименовывают, поскольку это более склонно к пакетной обработке.

0
27.01.2020, 20:54

Теги

Похожие вопросы