Рекурсивно выполнить команду Linux 'ar'

0

У меня есть каталог с сотнями подкаталогов со многими .lib файлами в них. Я могу использовать ar -x filename.lib Команда распаковать один из них, но мне было интересно, как можно было бы сделать это рекурсивно, так как нет встроенного рекурсивного флага в соответствии с man ar, Щас пытаюсь сделать

find . -name '*.lib' -exec ar -x {} +

но я получаю сообщение о каждом файле no entry filename.lib in archive, Я погуглил эту ошибку, но не смог найти ничего подходящего, и мой текущий метод основан на этот ответы на вопрос (а именно 2-й и его комментарии), но он явно не работает. Есть идеи, что я делаю не так?

Alerra
источник
Мета-примечание: нет такого понятия, как «второй ответ». Любой пользователь может самостоятельно заказать ответы «голосами», «старейшими» или «активными»; голоса меняются, активность обновляется ...
Kamil Maciorowski
@KamilMaciorowski мой плохой, исправил вопрос и сослался на 2-й голосом, который, поскольку вопрос старый, вероятно, будет вторым ответом на некоторое время.
Alerra

Ответы:

1

man 1 ar говорит, что синтаксис

ar [--plugin name] [-X32_64] [-]p[mod [relpos] [count]] archive [member...]

Таким образом, он работает с одним архивом за раз, дополнительные аргументы являются членами. Вы, очевидно, не хотите указывать участников.

find … -exec … {} + заменители {} с множественный пути. Чрезмерные пути интерпретируются как члены ar, Тебе нужно find … -exec … {} … \; который заменяет {} только с одним путем.

find . -name '*.lib' -exec ar -x {} \;

Таким образом, каждый найденный файл передается отдельный ar и удовлетворяет требованиям только для одного архива.

Замечания: -execdir может или не может быть лучше для вас. Ссылаться на man 1 find чтобы узнать разницу.

Kamil Maciorowski
источник
Вот Это Да! Спасибо за подробный и быстрый ответ. Я также рад узнать, что мой первоначальный ответ был не так уж и далек.
Alerra