Показаны сообщения с ярлыком скрипт bash. Показать все сообщения
Показаны сообщения с ярлыком скрипт bash. Показать все сообщения

четверг, 28 мая 2026 г.

Принудительная установка значения APM для внешних ноутбучных HDD (2,5 дюйма)

Боксы для установки в них 2,5 дюймовых дисков и дальнейшего подключения к компьютеру/ноутбуку через usb бывают разными. В том числе они отличаются по возможностям их электронной части. Это заметно в случае необходимости избавиться от периодической парковки головок, что было мной замечено при использовании HDD Toshiba и Hitachi. В качестве примера ниже приводятся снимки экрана при просмотре параметров SMART.

На этих снимках экрана электронная часть бокса транслирует все нужные возможности отображения SMART. Обратите внимание на доступность для просмотра данных во вкладках Atributes и Statistics. Вывод информации производится через дополнительно установленное ПО smartmontools и gsmartcontrol.





В плане рассматриваемого вопроса во вкладке General (самый первый рисунок). На рисунке видно, что значение APM Level отображается как 254 (максимальная производительность), то есть как будто бы на установленном в компьютере диске в утилите "Диски" в настройках диска в параметрах дополнительного управления электропитанием (APM) было установлено, что снижение оборотов запрещено.

Другим способом посмотреть установленный уровень APM является результат выполнения терминальной команды  sudo hdparm -I /dev/sdХ, где x – это третья буква, указанная для смонтированного устройства в утилите "Диски".


Введённая для рассматриваемого случая команда  sudo hdparm -I /dev/sdс  покажет такой же результат (см. в разделе Capabilities:):

Advanced power management level: 254

Более "печальная" картина имеет место при использовании другого бокса. Как видно из рисунков ниже, доступно отображение только вкладки General:



При запросе  sudo hdparm -I получены значения APM для диска Toshiba – 128, а для диска Hitachi – 1. Значение 1, если не ошибаюсь, соответствует 10 минутам и менее, а 128 – 15 минутам (подробности).



Следовательно, если длительное время держать подключенный к компьютеру такой бокс, то значение 193 SMART будет постоянно расти. И хотя ресурс парковок для ноутбучных HDD достаточно высокий (300-500 тысяч), но износа механизма хотелось бы поменьше. С целью принудительной установки APM в значение 254 при использовании таких боксов для своих нужд был создан небольшой сценарий (скрипт) sh

1. Запрашивается список смонтированных устройств.

2. На основании информации п.1 в поле ввода указывается нужный диск.

3. Для выбранного диска устанавливается APM=254

4. Проверяется текущее значение APM (произошло ли назначение APM).

Ниже приводится листинг скрипта и снимки экрана его работы. Установленные величины пауз sleep можно изменить на свои, которые обеспечат комфортное восприятие процесса. В ходе выполнения скрипта определяется, указан ли диск. Если диск не указан, то отображается уведомление о том, что диск указан не был.

#!/bin/bash
lsblk
sleep 5
zenity --width=200 --title "Disk" --text="Указать диск sda, sdb, sdc и т.п.:" --entry > /tmp/apm.txt
echo " "
echo " "
if [ -s /tmp/apm.txt ]; then
    echo "        Установка значения APM"
    echo " "
    sudo hdparm -B 254 /dev/$(cat /tmp/apm.txt)
    echo " "
    echo " "
    echo " "
    echo "        Проверка значения APM"
    echo " "
    sudo hdparm -I /dev/$(cat /tmp/apm.txt) | grep "Advanced power management level"
    echo " "
    echo " "
    sleep 20
  else
    echo " "
    echo " "
    echo "        Не указан диск."
    echo "        Повторите скрипт,"
    echo "        выбрав нужный диск."
    echo " "
    echo " "
    sleep 10
fi
rm /tmp/apm.txt
exit


Из рисунка выше видно, что подключены два внешних диска: sde и sdf. Диск sde, размером в 1 ТБ (931,5 ГБ после форматирования файловой системы) является диском HHD 3,5' и не нуждается в установке значения APM. В изменении значения APM нуждается диск sdf hfpvthjv d 500 ГБ (465,8 ГБ после форматирования), который и является ноутбучным 2,5' диском.





По злой иронии судьбы, у меня все нужные значения SMART отображаются при установке дисков в более дешёвые боксы, у которых крышки на защёлках. А при установке дисков в более дорогие боксы, у которых крышка на полозьях, значения SMART отображают только General. К первым (по данным вывода lsusb) относятся устройства JMicron USA Technology Corp. JMS578 и Initio Corporation MQ01ABF050, а ко вторым – Ugreen Storage Device и Realtek Semiconductor Corp. RTL9201.

Описанное выше, скорее всего, не будет работать с таким устройством:



среда, 28 августа 2024 г.

Автоматизация действий с файлами при использовании Syncthing

При использовании Syncthing можно организовать автоматическое раскладывание полученных файлов/папок из папки обмена в нужные папки. Операция производится через запуск скрипта sh, выполняемого по расписанию.

Подсчитывается количество файлов в папке источника $source (путь к папке задаётся в переменных скрипта, например, source=/home/minter/Документы/Exchange). Подсчёт производится без учёта вложенных папок папки источника, то есть из него исключаются папки .stfolder и .stversions. Также из подсчёта исключаются файлы, загрузка которых ещё не завершена и которые будут иметь расширение .tmp  Если результат подсчёта равен 0, то ничего не предпринимается. В противном случае выполняются какие-то действия.

#!/bin/bash
count=`find $source -maxdepth 1 -type f ! -name "*.tmp" | wc -l`
if [ $count -eq 0 ]; then
    :
  else
    перечисление действий или выполняемые скрипты sh
fi
exit

Например, перенести файлы jpg и mp4 в нужные папки $dest1 или $dest2. Подсчёт нужных файлов производится по их расширениям:

Для файлов jpg:

cjpg=`find $source -maxdepth 1 -name "*.jpg" | wc -l`
if [ $cjpg -eq 0 ]; then
      :
  else
      mv $source/*.jpg $dest1
fi

Для файлов mp4:

cmp4=`find $source -maxdepth 1 -name "*.mp4" | wc -l`
if [ $cmp4 -eq 0 ]; then
      :
  else
      mv $source/*.mp4 $dest2
fi 

Для переноса папок вопрос усложняется, так как необходимо учесть множество условий. Задача становится более простой, если передаваемая папка будет упакована в какой-либо архив: tar, zip. 7z  Если при подсчёте файлов будут найдены файлы с расширениями tar, zip, 7z, то будет запущена задача извлечения данных из таких архивов в папку назначения (например, $dest), а исходные файлы могут быть либо удалены начисто, либо перемещены в Корзину. Примеры ниже.

Файлы архивов tar

ctar=`find $source -name "*.tar" | wc -l`
if [ $ctar -eq 0 ]; then
    :
  else
    for package in $dest/*.tar;
    do
    tar -xf "$package" -C $dest
    done
    # указать одно из двух
    rm $source/*.tar  # удалить начисто
    gio trash $source/*.tar  # удалить в Корзину
fi

Файлы архивов tar.gz

ctargz=`find $source -name "*.tar.gz" | wc -l`
if [ $ctargz -eq 0 ]; then
    :
  else
    for package in $dest/*.tar.gz;
    do
    tar -xzf "$package" -C $dest
    done
    # указать одно из двух
    rm $source/*.tar.gz  # удалить начисто
    gio trash $source/*.tar.gz  # удалить в Корзину
fi

Файлы архивов zip

czip=`find $dest -name "*.zip" | wc -l`
if [ $czip -eq 0 ]; then
    :
  else
   for package in $dest/*.zip;
   do
   unzip -d $dest "$package"
   done
    # указать одно из двух
    rm $source/*.zip  # удалить начисто
    gio trash $source/*.zip  # удалить в Корзину
fi

Файлы архивов 7z

c7zsp=`find $source -name "*.7z" | wc -l`

if [ $c7z -eq 0 ];
  then
    :
  else
    for package in $source/*.7z;
    do
    7z x "$package" -o$dest
    done
    # указать одно из двух
    rm $source/*.7z  # удалить начисто
    gio trash $source/*.7z  # удалить в Корзину
fi

Если архивы 7z закрыты паролем, данный пароль не меняется и применяется постоянно, то команда распаковки будет иметь вид:

7z x -pпароль "$package" -o$dest

Такие архивы можно помечать дополнительной буквой, например s, добавляемой к концу имени файла. Тогда вместо *.7z нужно будет указать *s.7z

пятница, 15 марта 2024 г.

Запланировать выключение компьютера через графическую форму

Запланировать выключение компьютера в сеансе пользователя осуществляется через команду shutdown, которая вводится в терминале с указанием параметров. Но ввод команды можно сделать более удобным, если использовать графическую форму выбора, при использовании которой в терминал вводить ничего не требуется. Ниже приводится пример такой формы.


Указанное на рисунке выше третье значение +155 является результатом сложения чисел 60, 60, 35. То есть, оно является указанием значения в минутах ( для тех, кто не понял 😊 ).

Понятно, что после ввода в строку значения и последующего нажатия кнопки OK будет запланировано выключение компьютера "в" или "через". Если ничего не вводить и нажать ОК или нажать Отмена (пользователь передумал), или просто закрыть окно формы, то компьютер выключится через 1 минуту, так как будет выполнена команда shutdown без указания параметров. Но этого можно избежать, если после завершения работы формы будет произведена проверка на наличие введённого значения, то есть, чтобы файл не был пустым, например:


Собственно сам скрипт (исполняемый файл):

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [[ ! -z $(cat /tmp/down.txt) ]] ; then
    shutdown $(cat /tmp/down.txt) &
  else
    zenity --width=150 --height=50 --info --timeout=5 --title="Уведомление" --text="Не указано время\nвыключения.\nЗадание не назначено."
fi
exit

Пробелы перед знаком = подбирались так, чтобы этот знак на каждой последующей строке находился примерно под таким же знаком в предыдущей.

--width= и --height= определяют ширину и высоту форм.

--timeout=5 указывает на интервал в 5 секунд, после которого форма уведомления автоматически будет закрыта. Если это не востребовано, то используйте:

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [ -s /tmp/down.txt ]; then
    shutdown $(cat /tmp/down.txt) &
  else
    :
fi
exit

или так:

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [[ ! -z $(cat /tmp/down.txt) ]] ; then
    shutdown $(cat /tmp/down.txt) &
fi
exit

Вы можете подобрать свои значения, если указанные в примере скрипта вас не устраивают.

✅    Добавление подтверждающих сообщений

Результат ввода значений можно отобразить информационным сообщением. Примеры:



Чтобы отображалось нужное сообщение, поскольку ввод может быть как в формате ЧЧ:ММ (часов минут), так и в формате +М (минут), то в скрипт вводится проверка введённого значения на наличие символа двоеточия (или +, но тогда следует поменять местами порядок выполнения по условию).

var=`cat /tmp/down.txt`
if [[ $var =~ ":" ]]; then
    zenity --width=150 --height=50 --info --timeout=7 --title="Подтверждение" --text="Компьютер будет\nвыключен в $(cat /tmp/down.txt)"
  else
    zenity --width=150 --height=50 --info --timeout=7 --title="Подтверждение" --text="Компьютер будет\nвыключен\n через $(cut -c2- <<< $(cat /tmp/down.txt)) мин."
fi

Если в считанном значении будет найден символ двоеточия, то результатом будет вывод сообщения о выключении ЧЧ:ММ. В ином случае будет выводиться сообщение о выключении через М минут. При выводе второго сообщения не отображается символ +, что обеспечивается инструкцией $(cut -c2- <<< $(cat /tmp/down.txt)). --timeout=7 указывает, что после 7 секунд выводимое сообщение автоматически исчезнет. Таким образом, листинг скрипта с информационными сообщениями имеет вид: 

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [[ ! -z $(cat /tmp/down.txt) ]] ; then
    shutdown $(cat /tmp/down.txt) &
      var=`cat /tmp/down.txt`
      if [[ $var =~ ":" ]]; then
            zenity --width=150 --height=50 --info --timeout=7 --title="Уведомление" --text="Компьютер будет\nвыключен в $(cat /tmp/down.txt)"
         else
           zenity --width=150 --height=50 --info --timeout=7 --title="Уведомление" --text="Компьютер будет\nвыключен\n через $(cut -c2- <<< $(cat /tmp/down.txt)) мин."
      fi
  else
    zenity --width=150 --height=50 --info --timeout=5 --title="Уведомление" --text="Не указано время\nвыключения.\nЗадание не назначено."
fi
exit

✅   Чтобы сделать кнопку вызова созданного скрипта в главном меню создайте файл .desktop, например, Shutdown-at.dеsktop, который должен располагаться в скрытой папке вашего домашнего каталога (папки) ~/.local/share/applications и впишите в него:

[Desktop Entry]
Name=Shutdown-at
Exec=полный путь к файлу sh
Comment=Назначить время выключения
Terminal=false
PrefersNonDefaultGPU=false
Icon=укажите значок для кнопки, например, application-exit или system-shutdown
Type=Application
Categories=GTK;Development;

Если нужно, чтобы кнопка отображалась по-русски, то добавьте строку Name[ru]= , в которой укажите свой текст.

Строка Categries= не является обязательной. В данном случае она будет указывать на то, что кнопка будет отображаться в меню "Программирование" (Cinnamon) или "Разработка" (xfce).

Демонстрационный ролик (ниже или на Google Drive):

вторник, 5 марта 2024 г.

Склеить файл, разрезанный при помощи split, в терминале без указания терминальной команды

В данной публикации рассматривается обратная операция склеить файл, который был разрезан на части посредством терминальной команды split. Несмотря на выполнение команды именно в терминале от пользователя потребуется только пару раз щёлкнуть кнопкой мыши. 

 Создайте исполняемый файл sh с содержанием:

#!/bin/bash
echo " "
echo " "
echo "     Выберите папку с исходными файлами,"
echo "     имена которых начинаются на x..."
echo " "
echo " "
sleep 3
dir=$(zenity --file-selection --directory)
zenity --width=280 --question --title "Имя файла" --text="Укажите полное имя склеиваемого файла,\nвключая его расширение, например:\n\nХудожественный фильм.mkv или\nДокументальная телепередача.mp4\n $task" \
--ok-label="Да" \
--cancel-label="Нет"
answer=$?
if [ "$answer" -eq 0 ]; then
    zenity --width=100 --title "Ввод текста" --text "Ввод имени файла с расширением:" --entry > /tmp/output.txt
      elif [ "$answer" -eq 1 ]; then
      > /tmp/output.txt
      elif [ "$answer" -eq 5 ]; then
      > /tmp/output.txt
fi
if [ -s /tmp/output.txt ]; then
    cd "$dir"
    echo "     Производится склейка частей"
    echo "     в файл с указанным именем."
    echo " "
    echo "     По завершении процесса Вы получите"
    echo "     сообщение в этом же окне."
    cat x* > "$dir/$(cat /tmp/output.txt)"
    find "$dir" -maxdepth 1 -name 'x*' -exec rm {} \;
    echo " "
    echo " "
    echo "     Процесс успешно завершён."
    echo "     Исходные файлы х... удалены."
    echo " "
    echo " "
    sleep 7
    xdg-open "$dir" &
  else
    echo " "
    echo "     Вы не указали имя файла."
    echo " "
    sleep 3
fi
rm /tmp/output.txt
exit

В процессе работы сценария (скрипта bash) отображаются две формы запросов:



C вариантами ответов "Да" и "OK" всё понятно. В результате выполнения указанных выше форм создаётся файл /tmp/output.txt , содержащий имя выходного файла с его расширением.

Если же выбрано "Нет" в первой форме или "Отменить" во второй, либо нажата кнопка закрытия окна запроса, то также создаётся файл /tmp/output.txt , но без какого-либо содержания. То есть, с точки зрения его наполнения он является пустым.

Далее при помощи инструкции if [ -s /tmp/output.txt ] файл анализируется на наличие в нём содержания. Если он признаётся как "не пустой", то в выбранной в самом начале папке содержание всех файлов, имена которых начинаются на букву x, копируются в файл, имя которого считывается из файла /tmp/output.txt  По завершении процесса исходные файлы x... удаляются и в сопоставленном приложении (как правило, файловом менеджере) открывается папка со склеенным файлом.

Процесс сопровождается поясняющими фразами, отображаемыми в окне терминала. Эти фразы указаны в строках, начинающихся с echo. Сами тексты сообщений содержатся между кавычками. Число пробелов от левой кавычки до буквы подбиралось экспериментально с целью наилучшего восприятия строк текста в окне терминала.

При удалении исходных файлов используется инструкция maxdepth 1, которая указывает скрипту не искать файлы во вложенных папках, ограничившись верхним уровнем указываемого пути.

Если файл признаётся как "пустой", то никаких действий не производится, а просто отображается сообщение о том, что имя файла не указано.

После этого производится удаление /tmp/output.txt и работа скрипта завершается с автоматическим закрытием окна терминала.

После создания скрипта sh создайте для него кнопку запуска для его вызова из меню, например,

xed /home/minter/.local/share/applications/join.desktop

и впишите в него следующее:

[Desktop Entry]
Name=Join
Exec=/home/minter/Tools/scripts/modules/join.sh
Comment=
Terminal=true
PrefersNonDefaultGPU=false
Icon=emblem-plus
Type=Application
Categories=GTK;Development;
Name[ru]=Склеить файлы

В строке Exec= указывается полный путь до созданного файла sh

Icon= указывает на значок, под которым эта кнопка запуска будет отображаться в меню.

Categories=GTK;Development; означает, что кнопка будет расположена в меню "Программирование" в Cinnamon или "Разработка" в xfce. Если эту строку убрать, то кнопка будет расположена в меню "Прочие" в Cinnamon или "Прочее" в xfce.

 Name[ru]=Склеить файлы является необязательной строкой, указывающей на то, что кнопка должна отображаться не под именем Join, а под именем "Склеить файлы".

Перейдите в каталог applications

xdg-open /home/user/.local/share/applications

(user – это ваша домашняя папка) и в свойствах созданной кнопки запуска в разделе "Права" укажите, что его можно исполнять как программу. В Cinnamon он будет отображён как файл Склеить файлы без расширения, а в xfce как файл Join.desktop  Чтобы в файловом менеджере Thunar вместо значка шестерёнки отображался значок, указанный в строке Icon= в свойствах файла перейдите в раздел "Значок запуска" и поставьте галочку в поле "Установить этот файл как доверенный".

четверг, 4 января 2024 г.

Использование split без ввода в терминале команды с параметрами

Терминальную команду split можно использовать более удобным образом для пользовательского применения. Для этого заранее создаётся два сценария (скрипта bash), которые и обеспечивают желаемый процесс, а также кнопка запуска, собственно и запускающая процесс. Публикация описывает создание инструмента для личных нужд. Вдруг кому и пригодится. 🙏

1. Создание сценария (исполняемого файла sh), который запишет число частей, на которые необходимо разбить исходный файл. Например: 

#!/bin/bash
zenity --width=200 --title "Количество частей" --text="На сколько частей разбить файл:" --entry > /tmp/parts.txt
exit

--title "..." и --text="..." можно указать свои. В рассматриваемом примере результат будет таким:


Введённое значение будет записано в файл /tmp/parts.txt

2. Сценарий выполнения команды split сначала запросит местоположение файлы, который необходимо разбить на части, а затем разобьёт его на указанное в п.1 количество частей. Количество частей будет введено из ранее созданного файла /tmp/parts.txt  Чтобы в процессе выполнения команды split окно терминала не было пустым, то в него добавлен поясняющий текст.

#!/bin/bash
file=$(zenity --file-selection)
/home/minter/Tools/scripts/modules/what-parts.sh
echo " "
echo " "
echo "     Результат в виде файлов с именем x..."
echo "     будет размещён в домашнем каталоге."
echo " "
echo "     После завершения процесса окно"
echo "     терминала закроется автоматически."
echo " "
echo " "
split "$file" -x -n$(cat /tmp/parts.txt) -a2
exit

В приведенном примере /home/minter/Tools/scripts/modules/what-parts.sh является сценарием, который указан в п.1 (см. выше). Результат:


Сценарий также оформляется как исполняемый файл sh

3. Другая реализация изложенного выше подразумевает использование только одного файла sh, например, split.sh , но работа которого более наглядна и удобна для пользователя.

#!/bin/bash
zenity --file-selection > /tmp/filename.txt
file=`cat /tmp/filename.txt`
zenity --width=180 --height=50 --question --timeout=10 --title="Запрос" --text="На сколько частей\nразбить файл ?$task" \
--ok-label="2 и больше" \
--cancel-label="Отмена"
answer=$?
if [ "$answer" -eq 0 ]; then
    zenity --width=50 --height=330 --list --title="Разрезать файл" --checklist --editable --column=" на сколько " --column " частей " --text= "" "2" "" "3" "" "4" "" "5" "" "6" "" "7" "" "8" "" "9" "" "10" > /tmp/parts.txt
elif [ "$answer" -eq 1 ]; then
    > /tmp/parts.txt
elif [ "$answer" -eq 5 ]; then
    > /tmp/parts.txt
fi
if [ -s /tmp/parts.txt ]; then
    echo " "
    echo " "
    echo "     Результат в виде файлов с именем x..."
    echo "     будет размещён в домашней папке."
    echo " "
    echo "     После завершения процесса окно"
    echo "     терминала закроется автоматически."
    echo " "
    echo " "
    split "$file" -x -n$(cat /tmp/parts.txt) -a2
    sleep 3
  else
    echo " "
    echo " "
    echo "     Не указано количество частей."
    echo "     Повторите, указав количество частей."
    echo " "
    sleep 5
fi 
exit

При запросе о количестве частей, на которые необходимо разбить файл отобразится форма, в которой необходимо только выбрать уже готовые значения. 


В данной форме указано 9 вариантов: от 2 до 10. Если необходимо больше, то измените строку --text= путём добавления "" "11" "" "12" и т. д. Также, запуская сценарий, подберите значение по вертикали  --height=330 В противном случае у вас справа будет отображаться вертикальная полоса прокрутки, что на мой взгляд, не совсем удобно.

Если ничего не введено, то есть нажата кнопка закрытия окна или "Отменить", то файл указания частей /tmp/parts.txt создаётся пустым, то есть не содержащим какой-либо цифры. Далее идёт проверка данного файла на "пустоту" и если он будет признан "пустым", то у вас появится сообщение о невозможности выполнить запрошенную операцию.


4. Кнопка запуска для сценария выполнения команды split сначала создаётся на рабочем столе через правое контекстное меню мыши "Создать значок запуска" (xfce) или "Создать кнопку запуска" (Cinnamon). Созданный файл представляет из себя запускаемый файл .desktop, который в xfce необходимо переместить в скрытый каталог ~/.local/share/applications (домашней папки). В Cinnamon при создании такого файла система сразу же предлагает создать такой файл в указанном месте. Содержание файла (пример):

[Desktop Entry]
Version=1.0
Type=Application
Name=Split
Comment=
Exec=/home/minter/Tools/scripts/modules/split.sh
Icon=partitionmanager
Path=
Terminal=true
StartupNotify=false

По умолчанию, созданная кнопка будет расположена в категории Прочее/Разное. Если имеется необходимость, чтобы она отображалась в категории "Инструменты", то в конец файла добавьте строку, например,

Categories=Utility;

Если имя созданной кнопки было указано на английском языке, а в меню вам необходимо отобразить её на русском, то добавьте в файл строку (как пример):

Name[ru]=Разрезать файл

Icon= указывает на значок, под которым созданная кнопка будет отображаться. В поле Comment= добавить поясняющий текст для чего это нужно и "с чем его едят" 😁.

При тестовом запуске созданной кнопки и указания числа частей 30 при резке файла размером в 4,3 ГБ сначала были созданы файлы x00 ... x09. Затем были созданы файлы x0a, x0b, x0c, x0d, x0e, x0f  Впоследствии создавались файлы с именами x10 ... x19, а за ними – x1a, x1b, x1c, x1d

пятница, 8 декабря 2023 г.

Кнопка запуска пакетной передачи папок и файлов через rclone

Цель: передавать данные (файлы и/или папки с файлами) на облачные ресурсы через rclone c помощью вызова кнопки запуска приложения.

Ожидаемый результат: все что расположено в специальной папке будет передано в выбранное облако, а исходные данные в папке передачи будут удалены.

Необходимые условия:
1) папка, откуда будут передаваться данные;
2) установленное и соответствующим образом настроенное ПО rclone;
3) сценарий для указания адреса передачи в синтаксисе rclone (скрипт bash);
4) сценарий запуска передачи (скрипт bash);
5) собственно сама кнопка запуска.

Сценарий для указания адреса передачи в синтаксисе rclone

#!/bin/bash
out=/tmp/to.txt # файл, в который будет записан адрес передачи
zenity --width=200 --title "Cloud" --text="Адрес в формате rclone:" --entry > $out
exit


Пример ввода адреса в формате rclone: ydn1:Audio
Если в адресе имеются вложенные папки, то, к примеру, ydn1:Audio/папка1/папка2 
Если адрес имеет пробелы, то вводимые данные берутся в кавычки: "адрес"

Сценарий запуска передачи (пример)

#!/bin/bash
/home/minter/Tools/scripts/modules/what-cloud.sh
rclone move --delete-empty-src-dirs --progress /home/minter/Документы/Send $(cat /tmp/to.txt)
exit

$(cat /tmp/to.txt) подставляет в строку команды считанное из файла /tmp/to.txt значение адреса передачи.

Строка move --delete-empty-src-dirs --progress указывает rclone, что должно быть осуществлено перемещение данных в облако (со всей иерархией папок), а оставшиеся после перемещения данных пустые папки должны быть удалены. При этом передача будет сопровождаться отображением хода процесса, например:


Кнопка запуска приложения

На рабочем столе создаётся значок запуска (xfce), либо кнопка запуска (Cinnamon), в которой указывается вызов сценария запуска (передачи), в параметрах которой указано выполнение в терминале. Созданный значок запуска (кнопку запуска) переместите в свою папку ~/.local/share/applications  Значок/кнопка запуска представляет из себя исполняемый файл .desktop, который можно редактировать в текстовом редакторе. Пример:

[Desktop Entry]
Version=1.0
Type=Application
Name=Upload
Comment=
Exec=/home/minter/Tools/scripts/modules/upload.sh
Icon=mintupload
Path=
Terminal=true
StartupNotify=false

По умолчанию, значок/кнопка запуска будет отображаться в категории "Прочее" (xfce) или "Прочие" (Cinnamon). Для указания другой категории добавьте в файл строку Categories= , в которой после знака равенства укажите необходимые значения. Например, для "Разработка" (xfce) или "Программирование" (Cinnamon) это будет иметь вид Categories=GTK;Development; , а для категории "Интернет" – Categories=Network;

Если надо, чтобы кнопка отображалась по-русски, то добавьте строку Name[ru]= и после знака равенства напишите русский текст, например, Передача файлов (без кавычек).

После успешного завершения процесса передачи окно терминала будет закрыто автоматически.

понедельник, 27 ноября 2023 г.

Перекодировать flac в mp3

На днях возникла необходимость перекодировать большое число файлов flac в формат mp3. Как всегда, в извечном споре "сделать самому или найти того кто сделает" победила природная лень 😁. Потому что сразу были предприняты поиски в Интернет насчёт необходимых команд в терминале. А поскольку было желание организовать всё так как описано в этой публикации, то возникло стремление получить аналогичное решение вопроса.  

Создаётся сценарий sh и кнопка запуска, указывающая на созданный сценарий. 

Сценарий (скрипт sh)

#!/bin/bash
dir=$(zenity --file-selection --directory)
find "$dir" -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 320k {}.mp3 \;
find "$dir" -name "*.flac" -exec rm {} \;
find "$dir" -name '*.flac.mp3' -exec sh -c 'mv "$0" "${0%.flac.mp3}.mp3"' {} \;

Что он делает:
1. Запрашивает папку расположения файлов flac.
2. В указанной папке рекурсивно перекодирует файлы flac в файлы формата mp3 с указанным битрейтом. В данном примере битрейт указан как 320k. Укажите желаемую вами степень сжатия (например, 196k).
3. Удаляются все исходные файлы с раcширением flac
4. Поскольку перекодированные в формат mp3 файлы имеют расширение flac.mp3, то осуществляется переименование их расширения в mp3

Кнопка запуска представляет собой файл вида .desktop (пример создания здесь). 

Пример содержания файла .desktop кнопки запуска:
[Desktop Entry]
Version=1.0
Type=Application
Name=flac-mp3
Comment=
Exec=/home/minter/Tools/scripts/modules/flac-mp3.sh
Icon=audio-x-flac
Path=
Terminal=true
StartupNotify=false

После создания кнопки запуска переместите её с рабочего стола в папку своего профиля ~/.local/share/applications  После этого созданная кнопка запуска будет отображаться в главном меню в разделе "Прочее", "Разное" или ей подобной (зависит от дистрибутива). Если есть необходимость её отображения в разделе "Мультимедиа", то откройте созданную вами кнопку в текстовом редакторе, например,

xed /home/ваш_профиль/.local/share/applications/ваша_кнопка.desktop

в впишите в него строку  Categories=AudioVideo;Audio;

После запуска весь процесс отображается в окне терминала, которое после завершения всех задач будет автоматически закрыто.

суббота, 25 ноября 2023 г.

Запросы пользователю на монтирование дисков в папки его профиля

Про автоматическое монтирование дисков при старте системы имеется достаточное количество материалов. Но в большинстве случаев такие решения сводятся к внесению изменений в файл /etc/fstab. У меня же возникла необходимость выдачи запроса на монтирование дисков. При положительном ответе "да" диски будут смонтированы, при отрицательном "нет" монтирование производится не будет. 

Обусловлено личными потребностями, так как упоминаемые диски могут быть временно изъяты из компьютера и при обычном автомонтировании через /etc/fstab система будет на некоторое время сильно задумываться, пока не сообразит, что упоминаемых дисков не имеется и загрузка может быть продолжена.

Для удобства целесообразно создать стартовый сценарий, например, start.sh, который будет автоматически выполняться при каждом входе пользователя в систему. То есть, создать файл и установить его в автозагрузку. В Linux xfce это настраивается в Система/Сеансы и запуск, а в Cinnamon – Параметры/Автозагрузка. 

 #!/bin/bash
...
...
exit

Создаются 2 файла sh, которые собственно и командуют монтирование дисков. При этом каждый диск у меня идетифицируется не как /dev/sd... , а по своему uuid. Связано с тем, что при обратной установке шлейфы могут быть воткнуты не туда где были раньше, то есть порядок определения дисков по /dev/sd... может быть перепутан. А так как мои диски монтируются в папки AG-2 и AN-2 моего домашнего каталога, то не хочется быть удивлённым тому, что содержание данных папок потом будет не таким, как было раньше. uuid дисков определяется через команду 

sudo blkid

Для 1-го диска файл  mount-g2.sh

#!/bin/bash
mount --uuid="c57e4566-84ed-4d54-8cd4-1e0eaeac5b4e" /home/minter/AG-2 &
exit

Для второго диска файл mount-n2.sh

#!/bin/bash
mount --uuid="b72b0384-9782-4eaf-9606-ca48469ef6da" /home/minter/AN-2 &
exit

Поскольку монтирование осуществляется через sudo, то имеет смысл внести в файл /etc/sudoers записи, в соответствии с которыми пароль для sudo запрашиваться не будет.

sudo xed /etc/sudoers и внести строки (пример):

minter ALL=NOPASSWD: /home/minter/Tools/scripts/modules/mount-g2.sh
minter ALL=NOPASSWD: /home/minter/Tools/scripts/modules/mount-n2.sh

minter – это мой логин в системе.

Создаются 2 файла запросов на монтирование каждого из дисков. Пример приводится для 1-го диска (для второго будет аналогично):

#!/bin/bash
log=/home/minter/Документы/Reports/$(date '+%d').txt
zenity --width=150 --height=50 --question --timeout=10 --title="Запрос" --text="\nМонтировать G-2? \n$task" \
--ok-label="Нет" \
--cancel-label="Да"
answer=$?
if [ "$answer" -eq 0 ]; then
    :
    echo "$(date '+%H.%M.%S') – G-2 not mounted" >> $log
    echo "0" >> /tmp/mount1.txt
elif [ "$answer" -eq 1 ]; then
    sudo /home/minter/Tools/scripts/modules/mount-g2.sh
    echo "$(date '+%H.%M.%S') – G-2 mounted" >> $log
    echo "1" >> /tmp/mount1.txt
elif [ "$answer" -eq 5 ]; then
    sudo /home/minter/Tools/scripts/modules/mount-g2.sh
    echo "$(date '+%H.%M.%S') – G-2 mounted" >> $log
    echo "1" >> /tmp/mount1.txt
fi
exit 0

Если не нужно вести протокола и записывать результат "смонтировано" или "не смонтировано" в файлы /tmp/mount...txt, то строку log= и начинаются с echo  строки можно удалить. Мне они нужны для протоколирования отработки стартового сценария в целом, а также процедур по автоматической очистке Корзин на монтируемых дисках с удалением из них всех объектов (папки и файлы) старше 3 суток.

При появлении окна запроса система ожидает решения пользователя 10 секунд. Если за это время ничего не было выбрано, то система будет считать, что пользователь выбрал "Да", то есть монтировать и, соответственно перейдёт к команде монтирования диска, то есть

sudo /home/minter/Tools/scripts/modules/mount-g2.sh

Если выбрано "Нет", то монтирование диска не производится.

В start.sh вносятся команды с запросами монтирования с интервалом между ними 5 секунд и 5-секундным интервалом после запроса на монтирование 2-го диска. Интервал в 5 секунд необходим для того, чтобы окно запроса на монтирование 2-го диска не перекрывало окно запроса на монтирование 1-го диска. Вспомним, что система ожидает решения пользователя 10 секунд.

sleep 5
$do/modules/querry-mount-g2.sh
sleep 5
$do/modules/querry-mount-n2.sh
sleep 5

И, собственно, результат:


вторник, 25 июля 2023 г.

Посчитать число файлов fb2 в выбранной папке (действие в Nemo)

По аналогии с подсчётом числа файлов fb2 в выбранной папке через правое контекстное меню в xfce аналогичное действие в Nemo выполняется следующим образом.

Выполните в терминале команду nemo ~/.local/share/nemo/actions У вас откроется нужная папка, в которой создайте файл с расширением .nemo_action

В описываемом примере рассматривается файл count_fb2_files.nemo_action  Его содержание:

[Nemo Action]

Active=true
Name=Подсчет fb2
Comment=Сколько всего файлов fb2 в папке
Exec=sh -c 'find %F -name "*.fb2" | wc -l | cat - /dev/tty'
Icon-Name=emblem-hexagon-green
Selection=s
Extensions=dir;
Quote=double
Terminal=true

В строке Icon-Name= указано имя значка, под которым будет отображаться команда в правом контекстном меню (ПКМ).

В свойствах файла (Права) отметьте, что его разрешено выполнять как программу.

Для подсчёта числа любых файлов в выбранной папке строку Exec= укажите в виде:

Exec=sh -c 'find %F -type f | wc -l | cat - /dev/tty'

Количество файлов в выбранной папке будет отображено в окне терминала.

четверг, 20 июля 2023 г.

Кнопка запуска (лаунчер) для запланированного выключения Linux Mint

Как указано в различных публикациях на тему запланированного выключения Linux, для этого необходимо выполнить в терминале одну из команд: 

shutdown часов:минут для выключения в определённое время, например, 22:59 – shutdown 22:59;

shutdown +40 для выключения через 40 минут.

✅  Примечание. Обычно приводится команда shutdown -h часов:минут, но, как показала практика, достаточно команды shutdown часов:минут.

Для своих нужд (в угоду собственной ленивости 😄) было принято решение создать в меню кнопку запуска (лаунчер), которая, в зависимости от потребности, позволила бы вводить различные значения времени выключения и передавать их команде shudown.

Сначала создаётся скрипт (сценарий), который будет вызывать кнопка запуска, а затем создаётся сама кнопка запуска.

1. Скрипт (сценарий) представляет из себя файл текста (с расширением sh или без него), в свойствах которого (Права) указано, что его разрешено выполнять как программу.

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате, например,\n в часов:минут – 23:59 или\n через 15 минут – +15\nНичего не вводить или\nОтменить – через 1 минуту\n" --entry > /tmp/down.txt
shutdown $(cat /tmp/down.txt) &
exit

Выполняется запрос ввода времени когда или через сколько необходимо выключить компьютер. Введённое значение записывается во временный файл, например, /tmp/down.txt :

zenity --width=220 --title "Когда выключить" --text="Ввод в формате, например,\n в часов:минут – 23:59 или\n через 15 минут – +15\nНичего не вводить или\nОтменить – через 1 минуту\n" --entry > /tmp/down.txt

Значение --width=220 указывает на ширину окна формы запроса. Изменяя значение после знака = можно отрегулировать желаемую ширину окна формы запроса.

Символы \n указывают переходы на следующую строку.

shutdown $(cat /tmp/down.txt) & соответствует выполнению команды shutdown и значения, которое считывается из сохранённого файла /tmp/down.txt, после чего выполнение самого скрипта (сценария) завершается. Символ & означает переход к выполнению следующей команды, не дожидаясь завершения выполнения предыдущей.

Как это выглядит:


Если поясняющего текста формы отображать не требуется, то листинг формы запроса будет иметь вид:

zenity --width=220 --title "Когда выключить" --entry > /tmp/down.txt

2. Кнопка запуска (лаунчер) создаётся на рабочем столе через правое контекстное меню мыши. Примеры для Cinnamon и xfce смотрите по ссылкам: Cinnamonxfce. Указывать выполнение команды в терминале не требуется.

При создании кнопки запуска она по умолчанию создаётся на рабочем столе и в меню в категории "Разное". После создания кнопки запуска её с рабочего стола можно удалить (для поддержания его в чистоте 😀).

Если в категории "Разное" у вас имеется слишком много созданных кнопок запуска, то кнопку запуска запланированного выключения можно поместить в категорию "Программирование". Для этого откройте в менеджере файлов папку (каталог) своей домашней папки ~/.local/share/applications , найдите в ней свой созданный файл .desktop (в Cinnamon расширение .desktop отображаться не будет, будут отображены только названия файлов) и откройте его в текстовом редакторе. В конец файла добавьте строку 

Categories=GTK;Development;

и сохраните его. После этого ваша кнопка будет отображаться в категории "Программирование" (Cinnamon) или "Разработка" (xfce).

Протестируйте работу, указывая различные варианты запланированного времени выключения.

🔔  Будьте внимательны при вызове созданной кнопки запуска. Если вы даже ничего не вводили или нажали кнопку "Отменить", то у вас уже передана команда shutdown. Команда shutdown без аргументов соответствует команде выключения компьютера через 60 секунд.

При необходимости подбора ширины окна формы запроса времени выключения вводите в терминале команду: 

zenity --width=220 --title "Когда выключить" --text="Ввод в формате, например,\n в часов:минут – 23:59 или\n через 15 минут – +15\nНичего не вводить или\nОтменить – через 1 минуту\n" --entry > /tmp/down.txt

При этом передачи системе команды shutdown произведено не будет.

воскресенье, 25 июня 2023 г.

Запуск файлов приложений вида .desktop в bash

Для своих нужд возникла необходимость запуска приложений, оформленных в виде файлов .desktop через bash

Такие файлы расположены в  .~/.local/share/applications  При этом в файловом менеджере Nemo (Cinnamon) они отображаются по именам, а в файловом менеджере Thunar (xfce) к имени добавляется расширение  .desktop 



Запуск в bash задаётся командой  gtk-launch имя_файла  без указания местоположения или расширения. При этом подразумевается, что такой файл  .desktop  будет расположен именно в  ~/.local/share/applications

Не забывайте, что имя файла с пробелами необходимо брать в кавычки, например:

     gtk-launch "TR H-4"

пятница, 12 мая 2023 г.

Пакетное переименование расширения файлов JPG в jpg

При использовании 4K Slideshow Maker на Linux Mint было обнаружено, что при добавлении в слайшоу файлов изображений с расширением JPG в списке добавленных программа этих файлов не видит и, соответственно, не обрабатывает. Такое расширение файлов JPG необходимо переименовывать в jpg.

Для своих нужд написан маленький сценарий, при запуске которого выбирается каталог (папка), в котором необходимо произвести замену расширений JPG на jpg.

#!/bin/bash
dir=$(zenity --file-selection --directory)
find "$dir" -name '*.JPG' -exec sh -c 'mv "$0" "${0%.JPG}.jpg"' {} \;
exit

Сценарий можно оформить как кнопку запуска приложений. Кнопка запуска приложений представляет из себя обычный текстовый файл с расширением .desktop. который размещается в скрытом каталоге домашнего каталога пользователя ~/.local/share/applications и имеет права на выполнение (в качестве программы).

[Desktop Entry]
Version=1.0
Type=Application
Name=Переименовать JPG в jpg
Comment=
Exec=/home/minter/Tools/scripts/modules/rename-nemo-JPG-to-jpg.sh
Icon=emblem-cozy-drive-1
Path=
Terminal=false
StartupNotify=false

Значение Exec= указывает на расположение данного сценария в файловой системе.
Значение Icon= указывает на значок, под которым кнопка запуска приложений будет отображаться. Значок указывается только по имени, то есть без пути и без расширения.

Если необходимо чтобы сценарий был запущен в терминале, то измените Terminal=false на Terminal=true

При указанном выше листинге файла desktop кнопка запуска "Переименовать JPG в jpg" будет расположена в категории "Прочее". Чтобы эта кнопка запуска отобразилась в категории "Графика" добавьте в конец файла строку Categories=Graphics;

суббота, 11 марта 2023 г.

Удаление остатков работы с архивами zip в каталоге .cache

Не так давно при случайной инспекции содержания скрытого каталога .cachc своего домашнего каталога (папки) были обнаружены следы, оставшиеся при работе несколько дней назад с архивами zip. Эти упомянутые остатки автоматически не удалились, поэтому возникла задача избавления от этих следов в автоматическом режиме. 


В имеющийся у меня стартовый сценарий, запускаемый при входе пользователя в систему, внесена команда поиска и удаления в ~/.cache папок, имя которых совпадает с .fr-*  В принципе, при отсутствии своего стартового сценария данную команду можно использовать отдельно.

find /home/user/.cache -type d -name ".fr-*" -exec rm -rdf {} \;

user ‒ это имя домашнего каталога пользователя user. У вас оно будет своё.

понедельник, 31 октября 2022 г.

Внесение в cron нескольких заданий через bash

Возникла необходимость внесения двух заданий в в cron. Например, одно задание должно выполняться ежедневно каждую 1 минуту часа с 18 до 21 часов, а второе задание также должно выполняться ежедневно, но в 21 час. 5 минут.

Если компьютер свой, то назначить эти задания можно через команду терминала crontab -e (см. пользовательское задание cron):

01 18-21 * * * /home/minter/.config/scripts/cron1.sh

05 21 * * * /home/minter/.config/scripts/cron2.sh

Но если компьютер не свой (вы кому-то помогаете дистанционно) или каждый раз просто лень постоянно вносить изменения в сron через  crontab -e ?

К счастью, решение имеется. Достаточно выполнить скрипт, который перезапишет пользовательский cron содержанием готового файла, в который заранее внесены все необходимые команды. 

Создадим скрипт, который "обнулит" текущий cron пользователя и запишет новый cron из подготовленного файла. 

🔰   Примечание. Приём заимствован из арсенала администраторов Linux, но с успехом работает и в системе только с одним пользователем. 

Пример:

#!/bin/bash
crontab -r
crontab -u minter /home/minter/Shared/cronjob
exit

-u minter  указывает на то, что новый cron будет назначен для пользователя системы с логином minter. Если пользователь имеет логин user, то будет -u user

/home/minter/Shared/cronjob  указывает полный путь к файлу cronjob

Сохраните данный скрипт как исполняемый файл sh, например newcron.sh 

Файл cronjob (или любое другое имя) представляет из себя обычный текстовый файл. Пример:

#
01 18-21 * * * /home/minter/.config/scripts/cron1.sh
05 21 * * * /home/minter/.config/scripts/cron2.sh

Обратите внимание, что в данном текстовом файле нет необходимости делать перевод каретки на новую строку, как это предписано при редактировании через crontab -e

Попробуйте выполнить созданный скрипт.  Откройте на редактирование cron (crontab -e) и убедитесь, что синтакис cron соблюдён, то есть пустая строка в конце присутствует.

суббота, 17 сентября 2022 г.

Пакетное (массовое) переименование файлов через bash

Задача: переименовать файлы, убрав из их наименований лишние символы. Приводимый пример описывает массовое переименование файлов Classy_Wallpapers_...

При использовании средства массового переименования файлов через Bulk Renamer со временем появилась некоторая неудовлетворённость необходимостью осуществлять ряд однотипных действий применительно к каждому набору файлов (папок с файлами). Поскольку во всех папках присутствуют файлы, содержащие в себе один и тот же набор символов, то для массового переименования файлов в папке было принято решение попробовать воспользоваться средствами bash.  Для его использования необходимо наличие установленной программы rename. Как правило, она уже в системе присутствует, но если её не имеется, то устанавливается командой  sudo apt install -y rename

В итоге получился сценарий (скрипт):

#!/bin/bash
dir=$(zenity --file-selection --directory)
cd "$dir"
rename 's/Classy_Wallpapers_//g' *.jpg
rename 's/__/_/g' *.jpg
exit

🔎   Пояснения. 

dir=$(zenity --file-selection --directory) осуществляет выбор папки (каталога), содержащего файлы, имена которых необходимо обработать, а команда cd "$dir" осуществляет переход в выбранную папку (каталог). Кавычки учитывают пробелы в имени папки или пути к ней.

Далее следуют команды непосредственно замены "чего" на "что".

Команда  rename 's/Classy_Wallpapers_//g' *.jpg  во всех файлах jpg удаляет из названия файлов Classy_Wallpapers_

Команда  rename 's/__/_/g' *.jpg  во всех файлах jpg заменяет символ __ на символ _

Как итог, при массовом переименовании файлов осуществляется 2 действия (запустить скрипт и выбрать папку с файлами) вместо прежних 9. Так как нет необходимо использовать графический интерфейс, то операции замены символов в именах файлов происходит значительно быстрее, чем при использовании массового переименования из комплекта поставки Linux Mint. Команду скрипта (сценария) sh можно "посадить" на горячие клавиши через "Настройка клавиатуры – Комбинации клавиш" либо через программу Autokey.