Рекурсивно извлечь все 7z

У меня есть много архивов 7z, вложенных во многие подпапки, и я хочу извлечь все эти архивы в папки, в которых они находятся, а затем удалить исходные архивы.

Я нашел, как это сделать, извлекая в корневой каталог.

while [ "`find . -type f -name '*.7z' | wc -l`" -gt 0 ]; do find -type f -name "*.7z" -exec 7za x -- '{}' \; -exec rm -- '{}' \;; done

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

1
задан 26 May 2015 в 12:19

1 ответ

Использовать -execdir вместо -exec;

find . -type f -name "*.7z" -execdir 7za x {} \; -exec rm -- {} \;

-execdir выполнения в каталоге, содержащем файл. От man find:

-execdir command {} +
      Like   -exec,   but  the  specified  command  is  run  from  the
      subdirectory containing the matched file, which is not  normally
      the  directory  in  which  you  started  find. 

Другие комментарии:

Использовать -quit в while проверка find, так, чтобы find не продолжает искать после того, как соответствие было найдено (см. https://unix.stackexchange.com/a/13880/70524):

while [ -n "$(find . -type f -name '*.7z' -print -quit)" ]
do 
    find . -type f -name "*.7z" -execdir 7za x {} \; -exec rm -- {} \;
done
4
ответ дан 26 May 2015 в 12:19

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

Похожие вопросы: