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