Как найти файл в пакете rpm и скопировать его в одной командной строке?

Как я могу найти и найти определенный файл в пакете 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

Что вы подразумеваете под словом «неправильный»? Пожалуйста, постарайтесь изолировать проблему, чтобы стало очевидно, вызывает ли у вас трудности yum или grep. Тем не менее, оба тега, которые вы применили, неверны, прочтите их описание. Вы можете отредактировать свой вопрос, чтобы исправить это, и, возможно, добавить тег «grep», если это применимо.

Ulrich Eckhardt 04.05.2024 11:05

Хорошо. Мой вопрос обновлен. Мне пришлось перевести сообщения об ошибках с немецкого на английский.

Coding Monkey 04.05.2024 11:12
-exec — примитив find; вы не можете передать его grep или чему-то еще, кроме find.
Charles Duffy 04.05.2024 11:13

Если вы хотите извлечь файл из RPM, вам необходимо загрузить этот RPM. После этого вы можете использовать rpm2cpio для доступа к нему как к архиву cpio, что позволит вам использовать то же использование, которое вы использовали бы для непосредственного извлечения определенного файла из архива cpio.

Charles Duffy 04.05.2024 11:15

Я устанавливаю пакет RPM через yum. Затем я хочу извлечь один файл из установленного пакета yum и затем снова удалить пакет.

Coding Monkey 04.05.2024 11:24

Посмотрите xargs, это может помочь.

Ulrich Eckhardt 04.05.2024 11:36

Почему это должна быть «одна командная строка»?

jhnc 04.05.2024 14:22

Потому что я хочу использовать его в одной задаче Ansible, где я извлекаю имя файла и копирую его в другое место. В то же время я регистрирую путь к переменной Ansible.

Coding Monkey 04.05.2024 17:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Надеюсь, я правильно понял ваш вопрос, и, возможно, это не лучшее решение, но все равно вот.

Мои тесты были основаны на бинарном пакете 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

Надеюсь, это поможет.

Другие вопросы по теме