(Обратите внимание, что мы запускаем четыре потока параллельно, чтобы ускорить работу. :-))
Проблема с этой командой заключается в том, что xargs выполняется в каталоге верхнего уровня для каждого файла RAR. Это означает, что весь вывод выводится в папку верхнего уровня.
Вместо этого я хочу, чтобы выходные данные существовали в той же папке, что и архив RAR.
Каждый из файлов «File1.rar» содержит файл с таким же именем. Таким образом, извлечение их всех в папку верхнего уровня вызывает проблемы с перезаписью.
Подводя итог, я хочу извлечь все файлы RAR в вышеуказанной иерархии. Я хочу, чтобы содержимое каждого файла RAR существовало в папке, в которой находится файл RAR.
Мне кажется, что решение состоит в том, чтобы как-то установить рабочий каталог, а затем запустить там форму команды unrar. Однако, так как команда find дает мне имена файлов, а не каталоги, я не могу сделать что-то вроде
| xargs -I{} -n 1 -P 4 cd {} \; unrar x {}
Если не считать написания сценариев Perl или Python, которые будут обтекать команду unrar и обрабатывать разбиение предоставленного пути на его части и выполнение команды, есть ли лучший способ добиться этого?
2 ответа на вопрос
3
jjlin
There exist commands to extract a directory name (dirname) and file name (basename) from a path. So you could do something like
AFAIK, xargs doesn't support changing directories, so you would need some intermediary to do that, hence the /bin/sh. You mentioned writing a wrapper around unrar, and that is basically what this is doing, except in one-liner form.
Потрясающие! Именно то, что мне было нужно. Спасибо!
fdmillion 9 лет назад
0
Это работает, если в именах путей нет пробелов, если есть пробелы, кажется, вам нужно набрать кавычки до нелепого уровня 'cd "$ (dirname" {} ")"; unrar x "$ (basename" {} ")" '(я использую unzip, а не unrar, но с той же разницей)
junichiro 6 лет назад
0
1
Ole Tange
Using GNU Parallel it looks like this:
find . -name '*.rar' | parallel cd {//} '&&' unrar x {/}
GNU Parallel is a general parallelizer and makes is easy to run jobs in parallel on the same machine or on multiple machines you have ssh access to.
If you have 32 different jobs you want to run on 4 CPUs, a straight forward way to parallelize is to run 8 jobs on each CPU:
GNU Parallel instead spawns a new process when one finishes - keeping the CPUs active and thus saving time:
Installation
If GNU Parallel is not packaged for your distribution, you can do a personal installation, which does not require root access. It can be done in 10 seconds by doing this: