Как я могу найти и найти определенный файл в пакете rpm и скопировать его за одно выполнение из командной строки?
Я попытался с помощью yum repoquery просмотреть все файлы в пакете rpm и найти конкретный файл с помощью grep. После этого я хотел бы взять путь к результату и скопировать его в папку /tmp.
Следующая команда неверна:
yum repoquery -l rpm_package | grep "specifc/file.txt" -exec cp "{}" /tmp \;
В результате чего:
grep: specifc/file.txt: File or directory not found
grep: cp: File or directory not found
grep: {}: File or directory not found
grep: /tmp: Is directory
grep: ;: File or directory not found
Хорошо. Мой вопрос обновлен. Мне пришлось перевести сообщения об ошибках с немецкого на английский.
-exec
— примитив find
; вы не можете передать его grep
или чему-то еще, кроме find
.
Если вы хотите извлечь файл из RPM, вам необходимо загрузить этот RPM. После этого вы можете использовать rpm2cpio для доступа к нему как к архиву cpio, что позволит вам использовать то же использование, которое вы использовали бы для непосредственного извлечения определенного файла из архива cpio.
Я устанавливаю пакет RPM через yum. Затем я хочу извлечь один файл из установленного пакета yum и затем снова удалить пакет.
Посмотрите xargs
, это может помочь.
Почему это должна быть «одна командная строка»?
Потому что я хочу использовать его в одной задаче Ansible, где я извлекаю имя файла и копирую его в другое место. В то же время я регистрирую путь к переменной Ansible.
Надеюсь, я правильно понял ваш вопрос, и, возможно, это не лучшее решение, но все равно вот.
Мои тесты были основаны на бинарном пакете putty.rpm
.
Существует команда под названием «rpmdev-extract» (из пакета rpmdevtools
), которая позволит вам (как следует из ее названия) извлечь (все) содержимое RPM, но я не нашел способа «фильтровать " конкретное имя файла.
Согласно этой странице, двоичный пакет RPM содержит финальную полезную нагрузку в формате cpio. Итак, предлагаемый подход заключается в использовании rpm2cpio
для извлечения этой полезной нагрузки и передачи ее команде cpio
, которая позволяет выбирать отдельные исходные файлы на основе заданного шаблона.
Отрывок из man-страницы:
cpio {-i|--extract} (...) [pattern...] [< archive]
Any non-option command line arguments are shell globbing patterns;
only files in the archive whose names match one or more of those
patterns are copied from the archive.
Вы можете запросить содержимое пакета RPM с помощью rpm -q -l name
.
В случае со «шпатлёй» я хочу извлечь из архива только файл «/usr/share/applications/putty.desktop».
Исполнение:
$ rpm2cpio putty.rpm | cpio -i --to-stdout '*/putty.desktop'
[Desktop Entry]
Name=Putty
Comment=A SSH, Telnet and Rlogin client
Exec=putty
Icon=putty
Terminal=false
Type=Application
Categories=Network;RemoteAccess;
StartupNotify=true
X-Desktop-File-Install-Version=0.26
Попытка экстраполировать вышеизложенное на ваши конкретные потребности:
rpm2cpio path/to/rpm_package.rpm | cpio -i --to-stdout '*specifc/file.txt' >/tmp/output.txt
Если все, что вам нужно, это найти путь, по которому был установлен данный файл, и скопировать его куда-нибудь, вы можете использовать xargs
, как предложил Ульрих Экхардт:
rpm -ql rpm_package | grep -m 1 -F 'specific/file.txt' | xargs -d '\n' cp -vt /tmp
... или, если ваша команда cp
не понимает опцию -t
(целевой каталог):
rpm -ql rpm_package | grep -m 1 -F 'specific/file.txt' | xargs -d '\n' -I '{}' cp -v '{}' /tmp
Надеюсь, это поможет.
Что вы подразумеваете под словом «неправильный»? Пожалуйста, постарайтесь изолировать проблему, чтобы стало очевидно, вызывает ли у вас трудности
yum
илиgrep
. Тем не менее, оба тега, которые вы применили, неверны, прочтите их описание. Вы можете отредактировать свой вопрос, чтобы исправить это, и, возможно, добавить тег «grep», если это применимо.