Предположим, я хочу рекурсивно распаковать файлы с шаблоном $ {file} *. zip
в некотором каталоге / home / A / XML
с использованием команды find
find /home/A/XML -type f -name "${file}*.zip" -exec unzip '{}' -d /target/path \;
На данный момент я хочу проанализировать список каталогов , а не просто / home / A / XML
for dir in "${path}"; do
find "${dir}" -name "${file}*\.zip" -type f -exec unzip '{}' -d "${dir}"/"${file}" \;
done
I пытается использовать цикл for
для анализа каталогов, но разархивирование останавливается сразу после 1-го каталога, что означает, что он делал то же самое, что и предыдущий код, только разархивировал его в каталоге / home / A / XML
.
caution: not extracting; -d ignored
Я получил указанную выше ошибку для остальных каталогов. Может ли кто-нибудь помочь мне в этом? Заранее спасибо.
Если список каталогов хранится в скалярной переменной $path
(не самое удачное имя для переменной, поскольку она является специальной в нескольких оболочках, но не в bash
), то вы сделаете следующее:
IFS=$'\n' # split on newline
set -o noglob # disable glob
for dir in $path # invoke the split+glob operator ($path unquoted)
do
find "$dir" -name "$file*.zip" -type f -exec unzip -d "$dir/$file" {} \;
done
Если бы $path
был массивом bash
, как в path=(dir1 dir2. ...)
, измените цикл на
for dir in "${path[@]}"
При использовании GNU find
, вы можете добавить предикат -quit
в конце команды find
, чтобы разрешить только один успешный unzip
на каталог, если вы не хотите, чтобы все zip
файлы были объединены в один каталог.
Обратите внимание, что опции должны располагаться перед аргументами без опций.