Страница 1 из 1

Пакетное задание распаковки группы файлов архивов 7z

Добавлено: 02 июн 2022, 19:54
madesta
Имеется задача распаковки набора файлов 7z пакетным заданием по нажатию кнопки запуска. При этом должна обеспечиваться возможность ручного выбора папки источника и папки назначения. В общем, рабочий скрипт удалось создать. Однако смущает использование команды realpath и последующего считывания полученного значения, а как заставить скрипт понимать пути источника и назначения по-другому - не знаю. Имеется ли возможность "упрощения" кода? К сожалению, сам в программировании на bash "дуб дубом", способным только заимствовать готовые конструкции. :blush:
Код под спойлером:
#!/bin/bash
# выбирается папка-источник
dir1=$(zenity --file-selection --directory)
# записывается путь папки-источника
realpath "$dir1" > /tmp/dir1.txt
# считывается путь папки-источника
place1=`cat /tmp/dir1.txt`
dir2=$(zenity --file-selection --directory)
realpath "$dir2" > /tmp/dir2.txt
place2=`cat /tmp/dir2.txt`
# для каждого архива 7z в папке-источника выполнить распаковку в выбранную папку назначения
for package in "$place1/*.7z";
do
7z x "$package" -o"$place2"
done
# найти и удалить файлы 7z в папке источника
find "$place1" -name "*.7z" -delete
exit

Пакетное задание распаковки группы файлов архивов 7z

Добавлено: 02 июн 2022, 20:20
demonlibra
Зачем записывать в файл путь, а потом вытаскивать путь из файла?
Почему не использовать переменные $dir1 и $dir2 сразу?

Код: Выделить всё

dir1=$(zenity --file-selection --directory)
dir2=$(zenity --file-selection --directory)
...
for package in "$dir1/*.7z"
   do
      7z x "$package" -o"$dir2"
done

Пакетное задание распаковки группы файлов архивов 7z

Добавлено: 02 июн 2022, 20:28
demonlibra
И вдогонку, если установите yad, то вот форма для ввода сразу двух или более каталогов.
Можно еще каких-нибудь функций накрутить.
Вроде в комментариях разжевал, что и зачем. Задавайте вопросы, если что-то не понятно.

Код: Выделить всё

sudo apt install yad

Код: Выделить всё

FORM=`yad --borders=20 --title="Какой-то заголовок" --text="Какие-то параметры" --text-align=center --form --separator="," --item-separator="|" --field=:LBL --field="А сделать ли то-то?:CHK" --field="Путь 1:DIR" --field="Путь 2:DIR" "" TRUE`
# Переменная $FORM содержит все введенные значения формы yad
# можете выполнить в терминале echo $FORM чтобы посмотреть содержимое

if [ $? = 0 ] # $? Содержит вывод последней команды. Если нажали OK, то вывод = 0. Т.е. выполнять только, если в форме нажали OK. Иначе сценарий будет выполнятся даже, если Вы нажали Отмену
   then
      check=$( echo $FORM | awk -F ',' '{print $2}') # Вытаскиваем 1-е значение из поля формы. Начинается с 2, потому что первое поле формы --field=:LBL горизонтальная линия.
      dir1=$( echo $FORM | awk -F ',' '{print $3}') # Вытаскиваем 2-е значение из поля формы
      dir2=$( echo $FORM | awk -F ',' '{print $4}') # Вытаскиваем 3-е значение из поля формы

      if [ $check = TRUE ] выполнить, если ставили галочку в поле "А сделать ли то-то?:CHK"
         then ....
      fi
fi
Для справки раздел Form options