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

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
madesta
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#1

02 июн 2022, 19:54

Имеется задача распаковки набора файлов 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

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

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

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

Перейти к ответу ➙

Аватара пользователя

demonlibra
Сообщения: 844
Зарегистрирован: 12 авг 2017, 09:09
Решено: 13
Откуда: Ростов-на-Дону
Благодарил (а): 29 раз
Поблагодарили: 204 раза
Контактная информация:

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

#2

02 июн 2022, 20:20

Зачем записывать в файл путь, а потом вытаскивать путь из файла?
Почему не использовать переменные $dir1 и $dir2 сразу?

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

dir1=$(zenity --file-selection --directory)
dir2=$(zenity --file-selection --directory)
...
for package in "$dir1/*.7z"
   do
      7z x "$package" -o"$dir2"
done
Basic (ZXSpectrum)→Ms-Dos→W95→W98→Me→XP→W7→Ubuntu 15.10→Xubuntu 16.04→Linux Mint 18.2-21.1
Контекстное меню Nemo
Сценарий вывода данных оценки ресурса диска SSD

Аватара пользователя

demonlibra
Сообщения: 844
Зарегистрирован: 12 авг 2017, 09:09
Решено: 13
Откуда: Ростов-на-Дону
Благодарил (а): 29 раз
Поблагодарили: 204 раза
Контактная информация:

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

#3

02 июн 2022, 20:28

И вдогонку, если установите 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
Basic (ZXSpectrum)→Ms-Dos→W95→W98→Me→XP→W7→Ubuntu 15.10→Xubuntu 16.04→Linux Mint 18.2-21.1
Контекстное меню Nemo
Сценарий вывода данных оценки ресурса диска SSD

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей