Рекурсивно извлечь все 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 ответ

Решение

Использование -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
Другие вопросы по тегам