У меня есть большая папка с архивами RAR. Существует значительная иерархия уровней папок. Я хочу разархивировать всю коллекцию архивов одновременно.
У меня есть следующий однострочник, который будет работать:
find -name "*.rar" -print0 | xargs -0 -n 1 -P 4 unrar x
(Обратите внимание, что мы запускаем четыре потока параллельно, чтобы ускорить работу. :-))
Проблема с этой командой заключается в том, что xargs выполняется в каталоге верхнего уровня для каждого файла RAR. Это означает, что весь вывод выводится в папку верхнего уровня.
Вместо этого я хочу, чтобы выходные данные существовали в той же папке, что и архив RAR.
Пример:
Top level
|--FolderA
|----File1.rar
|----File2.rar
|--FolderB
|----File1.rar
|----File2.rar
|----File3.rar
|--FolderC
|----File1.rar
|----File2.rar
Каждый из файлов «File1.rar» содержит файл с таким же именем. Таким образом, извлечение их всех в папку верхнего уровня вызывает проблемы с перезаписью.
Подводя итог, я хочу извлечь все файлы RAR в вышеуказанной иерархии. Я хочу, чтобы содержимое каждого файла RAR существовало в папке, в которой находится файл RAR.
Мне кажется, что решение состоит в том, чтобы как-то установить рабочий каталог, а затем запустить там форму команды unrar. Однако, так как команда find дает мне имена файлов, а не каталоги, я не могу сделать что-то вроде
| xargs -I{} -n 1 -P 4 cd {} \; unrar x {}
Если не считать написания сценариев Perl или Python, которые будут обтекать команду unrar и обрабатывать разбиение предоставленного пути на его части и выполнение команды, есть ли лучший способ добиться этого?