Я хочу разархивировать zip-файлы из текстового списка, каждого в его собственную папку и произвести ошибки в файл журнала.
Список похож на это:
0001.zip
0002.zip
Я знаю, что могу использовать следующую команду, но я просто не знаю, как выполнить вышеупомянутое.
find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;
Спасибо.
Так как у Вас уже есть команда sh -c 'unzip -d "${1%.*}" "$1"'
извлечения, можно использовать xargs
для преобразования входных файлов в аргументы:
xargs -a list-of-files -L1 sh -c 'unzip -d "${1%.*}" "$1"' _
Эти {}
не нужно, так как xargs
по умолчанию добавляет вход к списку аргументов. Эти -L1
заставляет его использовать одну строку входа как аргумент.
Затем просто перенаправляют вывод в файл:
xargs -a list-of-files -L1 sh -c 'unzip -d "${1%.*}" "$1"' _ &> zip.log
Или просто ошибки:
xargs -a list-of-files -L1 sh -c 'unzip -d "${1%.*}" "$1"' _ 2> zip.log
Если мы предполагаем, что у Вас есть текстовый список zip-файлов как:
zipfile1.zip
another_archive.zip
...
затем можно сделать
cat ziplist.txt | while read zipfile; do
zipdir="$(basename "$zipfile").d"
(
mkdir "$zipdir"
cd "$zipdir"
echo "Extracting $PWD/../$zipfile"
unzip "../$zipfile" 2>&1 > "../$zipfile.log"
)
done
, Это создаст каталог, разархивирует zip-файл в него при выписывании всего к файлу журнала в том же каталоге как сам zip-файл.