Как выполнить динамический поиск zip-файлов по определенному пути (например, /opt/uploading/"*"/multiple .zip
files) и распаковать их в ту же папку с zip-файлами?
Ниже функция распаковки нескольких zip-файлов и удаления zip-файлов. Но я хочу, чтобы zip-файлы были там с распакованными файлами.
while true; do
find -iname '*.zip' > zipindex
test -s zipindex || break
for zip in $(cat zipindex); do unzip -o $zip && rm $zip; done
done
решение1
Ну, rm $zip
это удаление файлов .Zip, так что удалите их.
решение2
Это гораздо больше подходит для цикла for, чем для цикла while. Таким образом вы также можете избавиться от ненужного сохранения результатов изfind -iname '*.zip' > zipindex
Вместо этого сделайте что-то вроде этого:
#!/bin/bash
for zip in $(find -iname '*.zip'); do
unzip -o $zip
done
Это позволит перебрать все строки, в которых найдены продукты.
Конечно, вам следует просто полностью отказаться от bash-скрипта и создать однострочник вроде такого:
find -iname '*.zip' -execdir unzip {} \;
EDIT: Благодаря @don_crissti и @ilkkachu мне удалось избавиться от вызова другого экземпляра оболочки в -exec. -execdir полезно знать!
решение3
Используя GNU Parallel, вы можете сделать это:
find my_dir | grep -E '\.zip$' | parallel unzip
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | grep -E '\.zip$' | parallel -u unzip
Таким образом, вам не придется томиться в ожидании следующего zip-файла.