GUI скрипты для Caja (scripts for Caja)

Автор Aalexeey, 19 апреля 2015, 21:34:29

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Aalexeey

Выкладываю несколько GUI скриптов для Caja. Так сказать посильный вклад в сообщество. Делались в отсутствии рядом семьи, но наличии свободного времени. Всё работает на MATE с некоторыми GTK2 пакетами из MATE 1.6 (т.к остановился на MATE 1.12 GTK2). Некоторые скрипты найдены на просторах и поправлены для большего удобства, некоторые написал сам с огромными время-затратами т.к. в Bash нихрена не сображал не моя область деятельности и всё по крупицам выискивал в сети. Ссылки на подходящие иконки находятся в каждом скрипте, на ваше усмотрение. Предложения принимаются, а разбор полётов нет, как я уже написал всё написано методом проб и ошибок (тыка), и по прежнему полируется. Пожалуйста не мусорить в теме.
¹Ctrl+C_Всё_имя_объекта: (¹ - добавлена чтобы скрипт был вверху первым, ², ³ и º - только эти четыре есть во всех шрифтах)
#! /bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: Ctrl+C Whole name
# DESCRIPTION:         GUI скрипт для Caja, копирующий имя файла с расширением
# REQUIRES: xsel, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/actions/dialog-apply.png

case $LANG in

ru* )
# Russian (ru-RU)
util="Ctrl+C_Whole_name"
in_clipboard="Имя выделенного объекта, в буфере обмена";;

esac

#Транслирует пробелы
allnames=$(echo "$1");

#Имя выбранного файла
wholename=$(basename "$allnames")

#Записать имя файла в буфер
echo -n "$wholename" | xsel -i -b -l /tmp/.xsel.log
notify-send "$util" "$in_clipboard"

exit 0
¹Ctrl+C_Имя_до_точки:
#! /bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: Ctrl+C Name to point
# DESCRIPTION:         GUI скрипт для Caja, копирующий имя файла без расширения
# REQUIRES: xsel, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/actions/dialog-apply.png

case $LANG in

ru* )
# Russian (ru-RU)
util="Ctrl+C Name to point"
in_clipboard="Имя выделенного объекта, в буфере обмена";;

esac

#Транслирует пробелы
allnames=$(echo "$1");

#Имя выбранного файла
wholename=$(basename "$allnames");

#Имя файла без расширения (и без точки)
name=${wholename%.*}

#Записать имя файла без расширения в буфер
echo -n "$name" | xsel -i -b -l /tmp/.xsel.log
notify-send "$util" "$in_clipboard"

exit 0
°Открыть_как_Text:
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: Open as a Text
# DESCRIPTION:         GUI скрипт для Caja, поможет быстрей открыть файлы типа .desktop
# REQUIRES: pluma
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/apps/accessories-text-editor.png

for file in `echo "$CAJA_SCRIPT_SELECTED_URIS"`
do

pluma $file

done

exit 0
²EXIF_Просмотр:
#!/usr/bin/perl -w

# AUTHOR:    (c) Tuomas Kuosmanen and Jakub Steiner, modified and translated by Aalexeey :-)
# NAME:    EXIF Dump
# DESCRIPTION:     Shows various things modern digital cameras embed in the image files
#                  like exposure time and aperture and other interesting information.
# REQUIRES:    perl, jhead, mate-dialogs, mate-dialogs-gnome
# LICENSE:    GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:    http://www.sentex.net/~mwandel/jhead , https://debianforum.ru/index.php?topic=9141.0
#                          e-mails: tigert@ximian.com , jimmac@ximian.com
# ICON_USED:       /usr/share/icons/gnome-colors-common/16x16/apps/internet-news-reader.png

use POSIX;
use Digest::MD5 qw(md5_hex);

die "Нет файлов... Лёгкая работа." unless @ARGV;

$hash = md5_hex(localtime);
$tempfile = "/tmp/foo.$hash";

foreach $file (@ARGV) {
$reply=`jhead \"$file\" 2>&1 > $tempfile`;
# print("REPLY:: $reply\n");
if ($reply =~ "прервано") {
  system("gdialog --title \"Сбой EXIF\" --msgbox \"Файл $file не содержит никакой EXIF информации.\" 100 100");
} else {
  system("gdialog --title \"EXIF для $file\" --textbox $tempfile 62 52");
}
}
system("rm $tempfile");
³PDF_Сжать:
#! /bin/bash

# AUTHOR: (c) Ricardo Ferreira, modified and translated by Aalexeey :-)
# NAME: PDF Compress
# DESCRIPTION:         GUI скрипт для Caja оптимизирующий PDF файлы
# REQUIRES: ghostscript, poppler-utils, mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: https://launchpad.net/compress-pdf , http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/apps/adobe-reader.png

#Сообщения
case $LANG in

ru* )
# Russian (ru-RU)
util="PDF_Compress"
error_nofiles="Не выбран pdf файл"
nothing="Ничего не было выбрано"
no_dirs="Директория не выбрана"
terminated="работа скрипта была\nдосрочно прекращена!"
error_ghostscript="Скрипту нужен ghostscript,\nкоторый не установлен."
label_filename="Сохранить PDF файл как..."
opt_level="Качество файла на выходе"
level_screen=" Наихудшее (screen)"
level_default=" Нормальное (default)"
level_low=" Среднее (ebook)"
level_high=" Высокое (printer)"
level_color=" Наилучшее (prepress)"
job_progress="Выполняется компрессия pdf файла...."
job_done="удачно уменьшен/оптимизирован";;

esac

ZENITY=$(which zenity)

fileselect="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"

#Имя выбранного файла
wholename=$(basename "$1")

#Расширение файла (без точки)
extension=${wholename##*.}

#Имя файла без расширения (и без точки)
pdf_file=${wholename%.*}

#Проверить установлен ли Ghostscript
GS="/usr/bin/ghostscript"
if [ ! -x $GS ]; then
$ZENITY --error --title="$util" --width=250 --text="$error_ghostscript"
exit 0;
fi

#Проверить выбран ли какойнибудь файл
if [ -z "$fileselect" ]; then
$ZENITY --warning --title="$util" --width=250 --text="$nothing\n$terminated"
exit 0;
fi
 
#Убедится что выбран PDF файл
mimetype=$(file -b -i "$1")
if [ -z "`echo $mimetype | grep -i 'pdf' `" ]; then
$ZENITY --warning --title="$util" --width=250 --text="$error_nofiles\n$terminated"
exit 0;
fi

#Спросить пользователя выбрать уровень оптимизации
selected_level=$($ZENITY  --list  --title="$util" --radiolist  --column "↓" --column "$opt_level" FALSE "$level_screen" TRUE "$level_default" FALSE "$level_low" FALSE "$level_high" FALSE "$level_color" --width=300 --height=200)
if [ -z "$selected_level" ]; then
$ZENITY --warning --title="$util" --width=250 --text="$nothing\n$terminated"
exit 0;
fi

#Выбор уровня оптимизации
case $selected_level in
        "$level_default")
                COMP_COMMAND="/default"
        ;;
        "$level_screen")
                COMP_COMMAND="/screen"
        ;;
        "$level_low")
                COMP_COMMAND="/ebook"
        ;;
        "$level_high")
                COMP_COMMAND="/printer"
        ;;
        "$level_color")
                COMP_COMMAND="/prepress"
        ;;
esac

#Выбор имени сохраняемого файла
temp_filename="$pdf_file"_"$extension".temp
suggested_filename="$pdf_file"[opt]."$extension"
output_filename=$($ZENITY --file-selection --save --confirm-overwrite --filename="$suggested_filename" --title="$label_filename")

if [ "$?" = 1 ] ; then
$ZENITY --warning --title="$util" --width=250 --text="$no_dirs\n$terminated"
exit 0;
fi

#Извлечь metadata из PDF файла
pdfinfo "$1" | sed -e 's/^ *//;s/ *$//;s/ \{1,\}/ /g' -e 's/^/  \//' -e '/CreationDate/,$d' -e 's/$/)/' -e 's/: / (/' > .pdfmarks
sed -i '1s/^ /[/' .pdfmarks
sed -i '/:)$/d' .pdfmarks
echo "  /DOCINFO pdfmark" >> .pdfmarks

#Запустить ghostscript одновременно с панелью состояния
(echo "0" ;
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=$COMP_COMMAND -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$temp_filename" "$1" .pdfmarks
rm .pdfmarks
echo "100") | (if `$ZENITY --progress --no-cancel --pulsate --auto-close --text="$job_progress" --width=300`;
then
mv -f "$temp_filename" "$output_filename" &
notify-send "$util" "$pdf_file.$extension\n$job_done"
else
killall gs
rm "$temp_filename"
exit
fi)
²A2[4xA4]Плакат: (Надо было напечатать плакат :'(, вот тут всё интересное и началось  ???)
#!/bin/bash

# AUTHOR:    (c) Aalexeey :-)
# NAME:    A2[4xA4]Poster
# DESCRIPTION:     GUI скрипт для Caja, создаёт из изображения постер A2
# REQUIRES:    imagemagick, mate-dialogs, mate-dialogs-gnome, mate-notification, libnotify-bin
# LICENSE:    GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:    https://debianforum.ru/index.php?topic=9141.0
# ICON_USED:       /usr/share/icons/gnome/16x16/actions/edit-cut.png

IFS=$'\t\n';

function jpg2png {

#Определение размеров оригинала
imageheight=$(identify -format "%h" $fileselect);
imagewidth=$(identify -format "%w" $fileselect);

name=$(basename $fileselect);
if [ $imageheight -ge $imagewidth ]; then
   (
   echo
   convert -quality 100 poster.png -resize 2362x3340 +repage -crop 2x2@ +adjoin -units PixelsPerInch -density 150 $fileselect $save_dir/${name%%.*}.png
   ) | zenity --progress --no-cancel --pulsate --text=" Разделяю на четыре листа A4\n $name" --auto-close
   notify-send "A2[4xA4]Poster" "Ваши четыре PNG файла сейчас в каталоге\n$save_dir"
# Здесь 100 — качество, 2362x3340 - условный размер A2 при dpi150, 2x2@ — на сколько⨯сколько разбить (A2 состоит из 4xA4)
fi

if [ $imageheight -lt $imagewidth ]; then
   (
   echo
   convert -quality 100 poster.png -resize 3340x2362 +repage -crop 2x2@ +adjoin -units PixelsPerInch -density 150 $fileselect $save_dir/${name%%.*}.png
   ) | zenity --progress --no-cancel --pulsate --text=" Разделяю на четыре листа A4\n $name" --auto-close
   notify-send "A2[4xA4]Poster" "Ваши четыре PNG файла сейчас в каталоге\n$save_dir"
# Здесь 100 — качество, 3340x2362 - условный размер A2 при dpi150, 2x2@ — на сколько⨯сколько разбить (A2 состоит из 4xA4)
fi
}

# Если ничего не выбрано то сразу выходим из программы
if [[ $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS == "" ]];
then
zenity --warning --text="Ничего не выбрано\!\nРабота сценария закончена\!";
exit 0;
else

# Выбор каталога для сохранения изображений
save_dir=$(zenity --file-selection --directory --title="Где сохраняем?");

if [[ "$?" != 0 ]]
then
zenity --warning --text="Каталог для сохраниния не выбран!\n\nРабота скрипта прекращена!"
exit 0;
fi

# Цыкл перебора выделенных файлов
for fileselect in `echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"`
do

# Если выделенный файл jpg
if [[ $fileselect =~ \.jpg ]] || [[ $fileselect =~ \.JPG ]] || [[ $fileselect =~ \.jpeg ]] || [[ $fileselect =~ \.JPEG ]] || [[ $fileselect =~ \.png ]] || [[ $fileselect =~ \.PNG ]]
then

# то вызываем функцию конвертирования
jpg2png

else
notify-send "A2[4xA4]Poster" "$(basename $fileselect) не PNG или JPG файл\nРабота скрипта досрочно прервана!"

fi
done
sleep 2
zenity --width 200 --info --text="Работа завершена....";

fi
³Hash_Сумма: (было удалено предложение посетить Google)  :P
#!/bin/bash

# AUTHOR:    (c) Sergei Chistyakov, modified by Aalexeey :-)
# NAME:    Hash Sum
# DESCRIPTION:     GUI для проверки хеша md5/sha1/sha256
# REQUIRES:    mate-dialogs, mate-dialogs-gnome, libnotify-bin
# LICENSE:    GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:    https://debianforum.ru/index.php?topic=9141.0
#                          e-mail: cooleech@gmail.com
# ICON_USED:       /usr/share/icons/gnome-colors-common/16x16/mimetypes/text-x-readme.png

HConFile="$HOME/.HashCheck/HC.conf"
SavedSettings=`cat $HConFile`

which xdg-user-dirs-update
if [ $? = 0 ]; then
. ~/.config/user-dirs.dirs # Import variables
fi

# Set desktop icon dir
if [ "$XDG_DESKTOP_DIR" = "" ]; then
if [ -d "$HOME/Desktop" ]; then
XDG_DESKTOP_DIR="$HOME/Desktop"
else
XDG_DESKTOP_DIR="$HOME"
fi
fi

if [ -e $HConFile ]; then
. $HConFile # Import variables
fi

if [ "$1" = "" ]; then
SelectedFile=`zenity --title="Укажите файл для подсчёта" --file-selection`
fi

if [ "$SelectedFile" = "" ]; then
if [ $# -gt 1 ]; then
zenity --error --text="Вы должны указать только один файл"
exit 1
fi
if [ "$1" = "" ]; then
exit 1
fi
fi

if [ -d "$1" ]; then
zenity --error --text="<b>$1</b> это каталог.
Этот скрипт не работает с каталогами!"
exit 1
fi

if [ "$SelectedFile" = "" ]; then
SelectedFile="$1"
fi

SelectedFileNameFix="${SelectedFile//'&'/&amp;}" # Fix for ampersand simbol

if [ `stat --printf="%s" "$SelectedFile"` = "0" ]; then
zenity --warning --text="<b>$SelectedFileNameFix</b> 0 байт!
Хэш проверка для данного файла не имеет смысла!"
exit 1
fi

if [ -d "${SelectedFile%/*}" ]; then # Check if dir or file
FileNoPath="${SelectedFileNameFix##*/}"
FilePath="${SelectedFile%/*}/" # md5sum, sha1sum and sha256sum need file path
else
FileNoPath="$SelectedFileNameFix"
FilePath="./" # md5sum, sha1sum and sha256sum need file path
fi

function DELETE_OLD_HASH_FILE {
zenity --question --title="Hash Sum" --text="Найден старый хеш-файл:\n<b>$FileNoPath$HashFile</b>\n\nЖелаете удалить его (рекомендуется)?" \

if [ $? = 0 ]; then
rm -f "$SelectedFile$HashFile" # Must keep path
fi
}

if [ -e "$SelectedFile".md5sum ]; then # Must keep path
HashFile=".md5sum"
DELETE_OLD_HASH_FILE
fi

if [ -e "$SelectedFile".sha1sum ]; then # Must keep path
HashFile=".sha1sum"
DELETE_OLD_HASH_FILE
fi

if [ -e "$SelectedFile".sha256sum ]; then # Must keep path
HashFile=".sha256sum"
DELETE_OLD_HASH_FILE
fi

# Get last states
if [ "$MD5_HASH_CHECKED" = "" ]; then
MD5state="TRUE"
else
MD5state="$MD5_HASH_CHECKED"
fi

if [ "$SHA1_HASH_CHECKED" = "" ]; then
SHA1state="FALSE"
else
SHA1state="$SHA1_HASH_CHECKED"
fi

if [ "$SHA256_HASH_CHECKED" = "" ]; then
SHA256state="FALSE"
else
SHA256state="$SHA256_HASH_CHECKED"
fi

if [ "$SAVE_TO_TEXT_FILE" = "" ]; then
TextFileState="FALSE"
else
TextFileState="$SAVE_TO_TEXT_FILE"
fi

if [ -r "$SelectedFile" ]; then
TypeOfHash=`zenity --width=400 --height=250 --list --checklist --title="Hash Sum" --text="Выберите алгоритм хеширования для <b>$FileNoPath</b> файла" \
--column "Что" --column "проверяем" $MD5state MD5 $SHA1state SHA1 $SHA256state SHA256 $TextFileState "Результат записать в текстовый файл"`
else
zenity --error --text "У Вас нет прав для чтения данного файла!"
exit 1
fi

if ! [ -e "$SelectedFile" ]; then
zenity --error --text "Файл <b>$FileNoPath</b> не найден!\nВозможно файл переименован, удалёнили перемещён!"
exit 1
fi
# Reset all
MD5state="FALSE"
SHA1state="FALSE"
SHA256state="FALSE"
TextFileState="FALSE"

case $TypeOfHash in
MD5*) # MD5 with any other
MD5state="TRUE"
(
echo "# Проверка MD5 хэш. Пожалуйста подождите, в зависимости от размера файла '$FileNoPath'\nи производительности вашего ПК, подсчет может занять некоторое время..."
md5sum "$SelectedFile" > /tmp/"$FileNoPath".md5sum
) | zenity --width="400" --progress --title="Проверка MD5 хэш" --text="" --percentage=0 --auto-close --no-cancel --pulsate
esac

case $TypeOfHash in
*SHA1*) # SHA1 with any other
SHA1state="TRUE"
(
echo "# Проверка SHA1 хэш. Пожалуйста подождите, в зависимости от размера файла '$FileNoPath'\nи производительности вашего ПК, подсчет может занять некоторое время..."
sha1sum "$SelectedFile" > /tmp/"$FileNoPath".sha1sum
) | zenity --width="400" --progress --title="Проверка SHA1 хэш" --text="" --percentage=0 --auto-close --no-cancel --pulsate
esac

case $TypeOfHash in
*SHA256*) # SHA256 with any other
SHA256state="TRUE"
(
echo "# Проверка SHA256 хэш. Пожалуйста подождите, в зависимости от размера файла '$FileNoPath'\nи производительности вашего ПК, подсчет может занять некоторое время..."
sha256sum "$SelectedFile" > /tmp/"$FileNoPath".sha256sum
) | zenity --width="400" --progress --title="Проверка SHA256 хэш" --text="" --percentage=0 --auto-close --no-cancel --pulsate
esac

case $TypeOfHash in
*Сохранить*) # Save in text file with any other
TextFileState="TRUE"
esac

case $TypeOfHash in
Сохранить*) # Save in text file only
exit 1
esac

case $TypeOfHash in
"") # No selection
exit 1
esac

CurrentSettings="# HASH CHECKER SETTINGS

MD5_HASH_CHECKED=$MD5state
SHA1_HASH_CHECKED=$SHA1state
SHA256_HASH_CHECKED=$SHA256state
SAVE_TO_TEXT_FILE=$TextFileState"

if [ ! "$SavedSettings" = "$CurrentSettings" ]; then
echo "$CurrentSettings" > $HConFile
fi

if [ -e /tmp/"$FileNoPath".md5sum ]; then
MD5hash=`cat /tmp/"$FileNoPath".md5sum`
MD5WithoutPath="${MD5hash%%  $SelectedFile}"
else
MD5WithoutPath="N/A"
fi

if [ -e /tmp/"$FileNoPath".sha1sum ]; then
SHA1hash=`cat /tmp/"$FileNoPath".sha1sum`
SHA1WithoutPath="${SHA1hash%%  $SelectedFile}"
else
SHA1WithoutPath="N/A"
fi

if [ -e /tmp/"$FileNoPath".sha256sum ]; then
SHA256hash=`cat /tmp/"$FileNoPath".sha256sum`
SHA256WithoutPath="${SHA256hash%%  $SelectedFile}"
else
SHA256WithoutPath="N/A"
fi

if [ "$TextFileState" = "TRUE" ]; then
if [ -e /tmp/"$FileNoPath".md5sum ]; then
md5hashFile=`cat /tmp/"$FileNoPath".md5sum`
echo "$md5hashFile" >> "$SelectedFile".md5sum
fi
if [ -e /tmp/"$FileNoPath".sha1sum ]; then
sha1hashFile=`cat /tmp/"$FileNoPath".sha1sum`
echo "$sha1hashFile" >> "$SelectedFile".sha1sum
fi
if [ -e /tmp/"$FileNoPath".sha256sum ]; then
sha256hashFile=`cat /tmp/"$FileNoPath".sha256sum`
echo "$sha256hashFile" >> "$SelectedFile".sha256sum
fi
fi

zenity --info --title="Hash Sum" --no-wrap --text="Файл: <b>$FileNoPath</b>
\nMD5 hash: <b>$MD5WithoutPath</b>\nSHA1 hash: <b>$SHA1WithoutPath</b>\nSHA256 hash: <b>$SHA256WithoutPath</b>"

if [ $? = 0 ]; then
   fi
fi

# Cleanup /tmp
if [ -e /tmp/"$FileNoPath".md5sum ]; then
rm -f /tmp/"$FileNoPath".md5sum
fi
if [ -e /tmp/"$FileNoPath".sha1sum ]; then
rm -f /tmp/"$FileNoPath".sha1sum
fi
if [ -e /tmp/"$FileNoPath".sha256sum ]; then
rm -f /tmp/"$FileNoPath".sha256sum
fi

exit 0
³MD5_Сумма:
#!/usr/bin/perl

# AUTHOR:    (c)Brian Connelly, modified and translated by Aalexeey :-)
# NAME:    MD5 Sum
# DESCRIPTION:     GUI скрипт для Caja, определяет MD5
# REQUIRES:    perl, mate-dialogs, mate-dialogs-gnome
# LICENSE:    GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:    https://debianforum.ru/index.php?topic=9141.0
#                          e-mails: pub@bconnelly.net, connelly@purdue.edu
# ICON_USED:       /usr/share/icons/gnome-colors-common/16x16/mimetypes/text-x-readme.png

$script_title="MD5 Sum";
$temp_file = "/tmp/md5" . "-" . `date +'%s'`;

if(!@ARGV)
{
system("gdialog --title \"$SCRIPT_TITLE Error\" --msgbox \"Файл не выбран\" 400 400 2>&1");
exit;
}

$num_files = @ARGV;

if($num_files < 30)
{
  $num_rows = $num_files * 5;
}
elsif($num_files < 100)
{
  $num_rows = $num_files
}
else
{
#Убедитесь что выходное окно не слишком большое
  $num_rows = 80;
}

foreach $file (@ARGV)
{
if(-d $file)
{
system("echo \"Не возможно вывести MD5 сумму для каталога '$file'\" 2>&1 >> $temp_file");
}
else
{
system("md5sum \"$file\" 2>&1 >> $temp_file");
}
}

chomp($temp_file);
system("gdialog --title \"$script_title Результат\" --textbox $temp_file $num_rows 80 2>&1");

system("rm $temp_file");
²JPG‹–›PNG‹–›PDF: (Объединены JPG, PNG и PDF конвертеры, добавлен выбор качества и инфо о файле, исправлена передача размеров и разрешения);
для корректной работы с pdf проверьте блокировку pdf Debian'ом в ImageMagick'е, об этом есть в сети.
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: JPG‹–›PNG‹–›PDF
# DESCRIPTION:         GUI скрипт для Caja, конвертирует png и jpg в pdf
# REQUIRES: imagemagick, poppler-utils, awk, mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/apps/conduit.png

case $LANG in

ru* )
# Russian (ru-RU)
util="JPG‹–›PNG‹–›PDF"
util_pdf=" в PDF"
util_jpg=" в JPG"
util_png=" в PNG"
conv_out="Как будем конвертировать?"
job_pdf=" PNG или JPG в файл PDF"
job_jpg=" PDF или PNG в файл JPG"
job_png=" JPG или PDF в файл PNG"
file_info=" Вывести информацию о файле"
starting="Проверяю файл ожидайте ..."
conv_level="Качество файла на выходе:"
highq=" Высокое "
mediumq=" Среднее "
lowq=" Низкое "
colo_level="Качество цвета на выходе:"
converting=" Конвертирую выбранный файл\n"
nothing="Ничего не было выбрано"
no_dirs="Директория не выбрана"
terminated="работа скрипта была\nдосрочно прекращена!"
choose_dir="Где сохраняем?"
the_file="Файл"
in_dir="сохранён в выбраном ранее каталоге ..."
wrong_image="Неправильный выбор"
wrong_file="Расширение файла противоречит задаче\nработа скрипта не может быть продолжена!"
job_done="Конвертация была\nуспешно завершена."
job_failed="Работа была прервана\nне конвертировано!";;

esac

allnames=$(echo "$1");
wholename=$(basename "$allnames");
name=${wholename%.*};

# Если ничего не выбрано то сразу выходим из программы
if [[ "$1" == "" ]]; then
zenity --warning --title="$util" --text="$nothing\n$terminated" --width 250;
exit 0;
fi

if ! [[ "$1" =~ \.[pPjJpP][nNpPdD][gGgGfF]$ ]] || [[ "$1" =~ \.[jJ][pP][eE][gG]$ ]]; then
notify-send "$util" "$wrong_file"
zenity --warning --title="$util" --text="$wrong_image\n$terminated" --width 250;
exit 0;
fi

# Выбор каталога для сохранения изображений
save_dir=$(zenity --file-selection --directory --title="$choose_dir");
if [[ "$?" != 0 ]]; then
zenity --warning --title="$util" --text="$no_dirs\n$terminated" --width 250;
exit 0;
fi

savedfile=$(echo "$save_dir/$name");

IFS=$'\t\n';

function jpg2pdf {
# Если выделенный файл png
if [[ "$fileselect" =~ \.[pP][nN][gG]$ ]]; then
png_pdf_job=$(zenity --list --radiolist --title="$util $util_pdf" --column "↓" --column "$colo_level" TRUE "$highq($colors)" FALSE "$mediumq(2700)" FALSE "$lowq(900)" --width=300 --height=200 | sed 's/[^0-9]//g');
if [ "$png_pdf_job" = "" ]; then
zenity --warning --title="$util $util_pdf" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
(
echo
convert -background white -alpha remove -alpha off $fileselect -units PixelsPerInch -density $imagedpi -geometry $resolution $transit_flif &&
echo
convert +dither -colors $png_pdf_job $transit_flif -units PixelsPerInch -density $imagedpi -geometry $resolution $savedfile.pdf
) | zenity --progress --no-cancel --pulsate --text="$converting $name" --auto-close
rm $transit_flif
fi
# Если выделенный файл jpg
if [[ "$fileselect" =~ \.[jJ][pP][gG]$ ]] || [[ "$fileselect" =~ \.[jJ][pP][eE][gG]$ ]]; then
jpg_pdf_job=$(zenity --list --radiolist --title="$util $util_pdf" --column "↓" --column "$conv_level" TRUE "$highq(100%)" FALSE "$mediumq(~90%)" FALSE "$lowq(~60%)" --width=300 --height=200 | sed 's/[^0-9]//g');
if [ "$jpg_pdf_job" = "" ]; then
zenity --warning --title="$util $util_pdf" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
(
echo
convert -background white -alpha remove -alpha off -quality $jpg_pdf_job $fileselect -units PixelsPerInch -density $imagedpi -geometry $resolution $savedfile.pdf
) | zenity --progress --no-cancel --pulsate --text="$converting $name" --auto-close
fi
sleep 0.5
if [ -f "$savedfile.pdf" ]; then
notify-send "$util $util_pdf" "$the_file $name.pdf\n$in_dir"
sleep 0.5
zenity --info --title="$util $util_pdf" --text="$job_done" --width 250;
else
zenity --warning --title="$util $util_pdf" --text="$job_failed" --width 250;
exit 0;
fi
}

function pdf2jpg {
# Если выделенный файл pdf
if [[ "$fileselect" =~ \.[pP][dD][fF]$ ]]; then
pdf_jpg_job=$(zenity --list --radiolist --title="$util $util_jpg" --column "↓" --column "$conv_level" FALSE "$highq(300)" TRUE "$mediumq(150)" FALSE "$lowq(100)" --width=300 --height=200 | sed 's/[^0-9]//g');
if [ "$pdf_jpg_job" = "" ]; then
zenity --warning --title="$util $util_jpg" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
(
echo
#gs -dNOPAUSE -dBATCH -sDEVICE=jpeg -r$pdf_jpg_job -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile="$savedfile-%d" "$fileselect"
pdftoppm -r $pdf_jpg_job -cropbox -jpeg "$fileselect" "$savedfile"
) | zenity --progress --no-cancel --pulsate --text="$converting $name" --auto-close
fi
# Если выделенный файл png
if [[ "$fileselect" =~ \.[pP][nN][gG]$ ]]; then
png_jpg_job=$(zenity --list --radiolist --title="$util $util_jpg" --column "↓" --column "$conv_level" TRUE "$highq(100%)" FALSE "$mediumq(~80%)" FALSE "$lowq(~60%)" --width=300 --height=200 | sed 's/[^0-9]//g');
if [ "$png_jpg_job" = "" ]; then
zenity --warning --title="$util $util_jpg" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
(
echo
convert $fileselect -background white -alpha remove -alpha off -quality $png_jpg_job -units PixelsPerInch -density $imagedpi -geometry $resolution $savedfile.jpg
) | zenity --progress --no-cancel --pulsate --text="$converting $name" --auto-close
fi
sleep 0.5
if [ -f "$savedfile.jpg" ] || [ -f "$savedfile-1.jpg" ]; then
notify-send "$util $util_jpg" "$the_file $name*.jpg\n$in_dir"
sleep 0.5
zenity --info --title="$util $util_jpg" --text="$job_done" --width 250;
else
zenity --warning --title="$util $util_jpg" --text="$job_failed" --width 250;
exit 0;
fi
}

function jpg2png {
# Если выделенный файл pdf
if [[ "$fileselect" =~ \.[pP][dD][fF]$ ]]; then
pdf_png_job=$(zenity --list --radiolist --title="$util $util_png" --column "↓" --column "$conv_level" FALSE "$highq(300)" TRUE "$mediumq(150)" FALSE "$lowq(100)" --width=300 --height=200 | sed 's/[^0-9]//g');
if [ "$pdf_png_job" = "" ]; then
zenity --warning --title="$util $util_png" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
(
echo
#gs -dNOPAUSE -dBATCH -sDEVICE=png16m -r$pdf_png_job -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile="$savedfile-%d" "$fileselect"
pdftoppm -r $pdf_png_job -cropbox -png "$fileselect" "$savedfile"
) | zenity --progress --no-cancel --pulsate --text="$converting $name" --auto-close
fi
# Если выделенный файл jpg
if [[ "$fileselect" =~ \.[jJ][pP][gG]$ ]] || [[ "$fileselect" =~ \.[jJ][pP][eE][gG]$ ]]; then
jpg_png_job=$(zenity --list --radiolist --title="$util $util_png" --column "↓" --column "$colo_level" TRUE "$highq($colors)" FALSE "$mediumq(2700)" FALSE "$lowq(900)" --width=300 --height=200 | sed 's/[^0-9]//g');
if [ "$jpg_png_job" = "" ]; then
zenity --warning --title="$util $util_png" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
(
echo
convert $fileselect -units PixelsPerInch -density $imagedpi -geometry $resolution $transit_flif &&
echo
convert +dither -colors $jpg_png_job $transit_flif -background white -alpha remove -alpha off -units PixelsPerCentimeter -density $imageppcm -geometry $resolution $savedfile.png
) | zenity --progress --no-cancel --pulsate --text="$converting $name" --auto-close
rm $transit_flif
fi
sleep 0.5
if [ -f "$savedfile.png" ] || [ -f "$savedfile-1.png" ]; then
notify-send "$util $util_png" "$the_file $name*.png\n$in_dir"
sleep 0.5
zenity --info --title="$util $util_png" --text="$job_done" --width 250;
else
zenity --warning --title="$util $util_png" --text="$job_failed" --width 250;
exit 0;
fi
}

# Цыкл перебора выделенных файлов
for fileselect in `echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"`
do

notify-send "$util" "$starting"

#Вывести информацию о файле
fileinfo=$(identify -verbose $fileselect);

#Определение разрешения оригинала
imagedpi=$(identify -units PixelsPerInch -format "%x" $fileselect | awk '{print sprintf("%.0f",$0/2)*2}');
imageppcm=$(bc<<<"scale=3;$imagedpi/2.53968" | awk '{printf("%.2f \n",$1)}');
xresolution=$(identify -units PixelsPerInch -format "%[fx:w]" $fileselect);
yresolution=$(identify -units PixelsPerInch -format "%[fx:h]" $fileselect);
resolution=$(echo "$xresolution"x"$yresolution");

#Качество цвета транзитного flif
transit_flif=$(echo "/tmp/$name.flif");
colors=$(identify -format "unique_colors:%k" $fileselect | sed 's/[^0-9]//g' | head -c 6);

# Если выделенный файл jpg
if [[ "$fileselect" =~ \.[jJ][pP][gG]$ ]] || [[ "$fileselect" =~ \.[jJ][pP][eE][gG]$ ]]; then
selectedjpg=`zenity --list --radiolist --title="$util" --column "↓" --column "$conv_out" TRUE "$job_pdf" FALSE "$job_png" FALSE "$file_info" --width=300 --height=200`;
if  [ "$selectedjpg" = "$job_pdf" ]; then
# то вызываем функцию конвертирования
jpg2pdf
elif  [ "$selectedjpg" = "$job_png" ]; then
# то вызываем функцию конвертирования
jpg2png
elif  [ "$selectedjpg" = "$file_info" ]; then
echo "$fileinfo" | zenity --text-info --title="$util" --width 700 --height=500;
elif  [ "$?" = 1 ]; then
zenity --warning --title="$util" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
# Если выделенный файл png
elif [[ "$fileselect" =~ \.[pP][nN][gG]$ ]]; then
selectedpng=`zenity --list --radiolist --title="$util" --column "↓" --column "$conv_out" TRUE "$job_pdf" FALSE "$job_jpg" FALSE "$file_info" --width=300 --height=200`;
if  [ "$selectedpng" = "$job_pdf" ]; then
# то вызываем функцию конвертирования
jpg2pdf
elif  [ "$selectedpng" = "$job_jpg" ]; then
# то вызываем функцию конвертирования
pdf2jpg
elif  [ "$selectedpng" = "$file_info" ]; then
echo "$fileinfo" | zenity --text-info --title="$util" --width 700 --height=500;
elif  [ "$?" = 1 ]; then
zenity --warning --title="$util" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
# Если выделенный файл pdf
elif [[ "$fileselect" =~ \.[pP][dD][fF]$ ]]; then
selectedpdf=`zenity --list --radiolist --title="$util" --column "↓" --column "$conv_out" TRUE "$job_png" FALSE "$job_jpg" FALSE "$file_info" --width=300 --height=200`;
if  [ "$selectedpdf" = "$job_png" ]; then
# то вызываем функцию конвертирования
jpg2png
elif  [ "$selectedpdf" = "$job_jpg" ]; then
# то вызываем функцию конвертирования
pdf2jpg
elif  [ "$selectedpdf" = "$file_info" ]; then
echo "$fileinfo" | zenity --text-info --title="$util" --width 700 --height=500;
elif  [ "$?" = 1 ]; then
zenity --warning --title="$util" --text="$nothing\n$terminated" --width 250;
exit 0;
fi
fi

done

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

#1
³deb_Repacker: (немного переработанный + fakeroot)
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: deb Repacker
# DESCRIPTION:         GUI скрипт для Caja, для разборки и сборки deb пакетов
# REQUIRES: awk| gawk | mawk, dpkg, fakeroot, mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/actions/extract-archive.png

case $LANG in

ru* )
# Russian (ru-RU)
util="deb_Repacker"
target="Поставленная задача"
rebuild="Воссоздать deb пакет"
fakeroot="Воссоздать пакет с fakeroot"
extract="Распаковать deb пакет"
cancel="Работа скрипта прекращена!"
deb_file="Для запуска скрипта выделяйте deb файл"
no_deb="Не был выбран Debian пакет!"
refused="Вы отказались от намеченного"
deb_folder="Содержимое deb пакета в папке"
unpacking="удалён, ждите распаковывается"
choose="Выберите подготовленный каталог, должен быть!"
no_folder="Ни один каталог не выбран."
md5_gen="сгенерирован, ожидайте...."
deb_build="Собирается ваш deb пакет, возможно,\nэтот процесс займёт некоторое время!"
deb_save="Ваш пакет сохранён в одной\nс его каталогом директории."
panic="Что то пошло совсем не так,\nвозможно это файл <b>control</b>,"
cyrilic="кодировка символов имени \nдиректории и.т.п.";;

esac

fileselect="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
filetype=$(file -b $fileselect | awk '{ print $1}' | tr -d '\n')
defaultdir="./"`basename $1 .deb`"[new]"
dirlog=`basename $1 .deb`"[new]"

selectedjob=$(zenity --list --radiolist --title="$util" --column "↓" --column "$target" FALSE "$rebuild" TRUE "$fakeroot" FALSE "$extract" --width=300 --height=200);

if  [ "$?" = 1 ]; then
    zenity --warning --title="$util" --text="$refused\n$cancel" --width=300
    exit 0;
fi

if  [ "$filetype" != "Debian" ] && [ "$selectedjob" = "$extract" ]; then
    notify-send "$util" "$deb_file"
    zenity  --warning --title="$util" --text="$no_deb\n$cancel" --width=300
    exit -1;
fi

if  [ "$selectedjob" = "$extract" ]; then
    dpkg-deb -R $fileselect $defaultdir/ | notify-send "$util" "md5sums $unpacking"
    rm $defaultdir/DEBIAN/md5sums
    rm $defaultdir/DEBIAN/md5sum
    cat /tmp/deb_repack_dpkg.log
    echo -n "$dirlog" > /tmp/deb_repack_dpkg.log
    sleep 1
    zenity --info --title="$util" --text="$deb_folder\n$defaultdir" --width=300
exit 0;
fi

savedlog=`cat /tmp/deb_repack_dpkg.log`

dirselect=$(zenity --file-selection --directory --title="$choose $savedlog");

if  [ "$?" = 1 ]; then
    zenity --warning --title="$util" --text="$no_folder\n$cancel" --width=300
    exit 0;
fi

if  [ "$selectedjob" = "$rebuild" ]; then
    cd $dirselect && find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum > $dirselect/DEBIAN/md5sums
    notify-send "$util" "md5sums $md5_gen"
    dpkg-deb -b $dirselect | zenity --progress --no-cancel --pulsate --text="$deb_build" --auto-close --width=300
    cp /dev/null /tmp/deb_repack_dpkg.log
    sleep 1
fi

if  [ "$selectedjob" = "$fakeroot" ]; then
    cd $dirselect && find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum > $dirselect/DEBIAN/md5sums
    notify-send "$util" "md5sums $md5_gen"
    fakeroot dpkg-deb -b $dirselect | zenity --progress --no-cancel --pulsate --text="$deb_build" --auto-close --width=300
    cp /dev/null /tmp/deb_repack_dpkg.log
    sleep 1
fi

if  [ -f "$dirselect.deb" ]; then   
    zenity --info --title="$util" --text "$deb_save" --width=300
else
    zenity --error --title="$util" --text "$panic\n$cyrilic\n$cancel" --width=300
exit 0;
fi

exit 0
°MO‹–›PO: (конвертирует файлы локализаций mo и po, облегчает использование Poedit)
#!/bin/bash

# AUTHOR: (c) Abhijit Jathar, modified and translated by Aalexeey :-)
# NAME: MO PO Converter
# DESCRIPTION:         GUI скрипт для Caja, конвертирует po в mo и наоборот
# REQUIRES: gettext, mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: https://launchpad.net/mopoco , http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/apps/conduit.png

case $LANG in

ru* )
# Russian (ru-RU)
util="PO_MO_Конвертер"
converted="конвертирован в"
converting="Конвертирую файл"
what_done="Следующие операции выполнены:"
wtf="не MO или PO файл"
cancelled="Работа скрипта досрочно прервана!"
nothing="Файл не выбран!";;

esac

fileselect="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
name=$(basename "$1")
type=$(file -i "$1")

if [ $# = 0 ]; then
zenity --error --text="$nothing"
exit 0;
fi

# Если выделенный файл po или mo
if [[ "$*" =~ \.[mMpP][oOoO]$ ]]; then

# то вызываем функцию конвертирования
for file in $*
do

filename=`echo $file | cut -f1 -d.`
extn=`echo $file | cut -f2 -d.`

if [ "$extn" = "mo" ]; then
# MO -> PO
out1=`echo "MO $converted PO\n$file -> $filename.po"`
out2=`nohup msgunfmt -v -o $filename.po $file && sleep 2 | zenity --progress --title="$util" --no-cancel --pulsate --text=" $converting\n $name" --auto-close --width 300`
elif [ "$extn" = "po" ]; then
# PO -> MO
out1=`echo "PO $converted MO\n$file -> $filename.mo"`
out2=`nohup msgfmt -c -v -o $filename.mo $file && sleep 2 | zenity --progress --title="$util" --no-cancel --pulsate --text=" $converting\n $name" --auto-close --width 300`
fi
out=`echo -ne $out1 $out2`
done

sleep 0.5

zenity --info --title="$util" --text="$what_done\r$out" --width 250

else
notify-send "$util" "$name\n$wtf\n$cancelled"

fi

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

#2
¹Process_Killer:
#! /bin/bash

# AUTHOR: (c) Cezar Matei, modified and translated by Aalexeey :-)
# NAME: Process Killer
# DESCRIPTION:         GUI скрипт для Caja принудительно завершающий процесс/приложение
# REQUIRES: mate-dialogs, mate-dialogs-gnome
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/actions/process-stop.png

case $LANG in

ru* )
# Russian (ru-RU)
sel_proc="Выбирете процесс для остановки:"
list_all="Все"
proc_s="Процессы"
of_u="пользователя"
proc="Процесс"
pid="с pid"
was_k="был остановлен"
not_f="<b>не</b>\nбыли остановленны"
cancel="Остановка отменена....";;

esac

process=`ps -u $USER | sed 's/  PID TTY/PID TTY  /' | sed 's/?/?       /' | zenity --list --column "$sel_proc" --text=" $proc_s $of_u <b>$USER</b>:" --width 400 --height 570`

ans=`echo $?`

if test "$ans" -eq "0"; then

select=`echo $process | cut -d" " -f1`

kill -KILL $select
ans1=`echo $?`
if [ "$ans1" == "0" ]; then
select1=`echo $process | cut -d":" -f3  | cut -d" " -f2`
            slt1=`echo $select1 | head -c 6`
echo | zenity --info --text="$proc <b>$slt1</b>.... $pid\n<b>$select</b> $was_k!" --width 200 --height 100
else
echo | zenity --error --text="$proc_s $pid $not_f!" --width 200 --height 100
fi
exit 0
fi

if test "$ans" -eq "1";
then
echo | zenity --warning --text="$cancel" --width 200 --height 100
exit 0
fi
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

CoolAller

Aalexeey, вот если бы вы сообразили как сделать скрипт показывающий в Caja тип файловой системы, exFat, FAT16, FAT32, NTFS и т.д. и позволяющий форматировать носители в эти FS по клику правой кнопки мыши)) Вот тогда Caja можно было бы считать вполне годным) 

Aalexeey

#4
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

#5
Открыть содержимое (спойлер)
°USB_Detacher:
#!/bin/bash

# AUTHOR:      (c) Mircea Moldovan, deeply modified and translated by Aalexeey :-)
# NAME:        USB Detacher
# DESCRIPTION: GUI скрипт для Caja - безопастное извлечение USB
# REQUIRES:    awk/gawk/mawk, util-linux, mate-dialogs, mate-dialogs-gnome, mate-notification, libnotify-bin
# LICENSE:     GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:     http://debianforum.ru/index.php?topic=9141.0
#              e-mail: mirceamld@gmail.com
# ICON_USED:   /usr/share/icons/gnome-colors-common/16x16/actions/media-eject.png

case $LANG in

ru* )
# Russian (ru-RU)
can_t_do="Необнаружено доступных устройств!"
choose_it="USB устройство для извлечения"
drive_no="№"
drive_id="ФС"
drive_size="Объём"
vendor_model="Имя раздела / Модель"
nothing="Не выбрано USB устройств!"
can_do="может быть извлечён!";;

esac

usbdlist1=$(find /sys/bus/usb/drivers/usb-storage/ -name '[0-9]-[0-9]:1.0' | wc -l)
usbdlist2=$(find /sys/bus/usb/drivers/usb-storage/ -name '[0-9]-[0-9].[0-9]:1.0' | wc -l)
usbdlist=$[$usbdlist1+$usbdlist2]
alldlist=$(awk '($4 ~ /sd[b-m]/)&&($4 !~ /sd[b-m][1-9]/) {print "/dev/"$4}' < /proc/partitions | wc -l)
nonusbdlist=$[$alldlist-$usbdlist+1]

if [ $usbdlist = 0 ]; then
   notify-send "USB_Detacher" "$can_t_do"
   exit
fi

declare -a device
declare -a devicesize
declare -a devicelabel

i=0
for dev in $(lsblk --noheadings --list | awk '($1 ~ /sd[b-m]/)&&($1 !~ /sd[b-m][1-9]/) {print "/dev/"$1}' | sort)
do
device[$i]=$dev
devicesize[$i]=$(lsblk $dev --noheadings --nodeps --output size)
devicelabel[$i]=$(lsblk $dev --noheadings --nodeps --output model)
let "i++"
done

if [ $i -eq 0 ]
then
   notify-send "USB_Detacher" "$can_t_do"
   exit 0
fi

index=`for ((j=$nonusbdlist; j<=i; j++))
do
echo $j
echo ${device[$j-1]}
echo ${devicesize[$j-1]}
echo ${devicelabel[$j-1]}
done | zenity --hide-column=1,2 --list\
--title="$choose_it"\
--column="$drive_no" --column="$drive_id" --column="$drive_size" --column="$vendor_model"`

if [ -z $index ]
then
   notify-send "USB_Detacher" "$nothing"
   exit 0
fi

for partition in $(awk -v hdd="${device[$index-1]}" '$1 ~ hdd {print $1}' < /proc/mounts)
do
mountpoint=$(awk -v partition="$partition" '$1 ~ partition { print $2 }' < /proc/mounts)
udisks --unmount $partition
done
udisks --detach ${device[$index-1]}
sleep 1
notify-send "USB_Detacher" "${devicelabel[$index-1]} $can_do"

exit 0
[свернуть]
°USB_Detacher2: (переработанный под udisks2)
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: USB Detacher2
# DESCRIPTION:         GUI скрипт для Caja - безопастное извлечение USB
# REQUIRES: awk, util-linux, udisks2, mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/actions/media-eject.png

case $LANG in

ru* )
# Russian (ru-RU)
util="USB_Detacher2"
can_t_do="Необнаружено доступных устройств!"
choose_it=" Устройство для извлечения"
drive_no="№"
drive_id="ФС"
drive_size="На"
vendor_model="Имя раздела / Модель"
nothing="Не выбрано USB устройств!"
can_do="может быть извлечён!";;

esac

usbdlist=$(lsblk | grep /media | grep -oP "sd[a-z]" | awk '{print "/dev/"$1}' | sort | uniq | wc -l)
nonusbplist=$(lsblk | grep -v /media | grep -oP "sd[a-z]" | awk '{print "/dev/"$1}' | sort | uniq | wc -l)
nonusbdlist=$[$nonusbplist-$usbdlist]

if [ $usbdlist = 0 ]; then
notify-send "$util" "$can_t_do"
exit 0;
fi

declare -a device
declare -a devicesize
declare -a devicelabel
declare -a devicemodel

i=0
for dev in $(lsblk -nl | grep disk | sed 1d | awk '{print "/dev/"$1}' | sort)
do
device[$i]=$dev
devicesize[$i]=$(lsblk $dev -ndo SIZE)
devicelabel[$i]=$(lsblk "$dev"1 -no LABEL)
    devicemodel[$i]=$(lsblk "$dev" -ndo MODEL)
let "i++"
done

if [ $i -eq 0 ]; then
notify-send "$util" "$can_t_do"
exit 0;
fi

index=`for ((j=$nonusbdlist; j<=i; j++))
do
echo $j
echo ${device[$j-1]}
echo ${devicesize[$j-1]}
echo ${devicelabel[$j-1]} ${devicemodel[$j-1]}
done | zenity --hide-column=1,2 --list\
--title="$choose_it"\
--column="$drive_no" --column="$drive_id" --column="$drive_size" --column="$vendor_model"`

if [ -z $index ]; then
notify-send "$util" "$nothing"
exit 0;
fi

number=$(sed 's/[^1-9]//g' <<< "$index")

for partition in $(awk -v hdd="${device[$number-1]}" '$1 ~ hdd {print $1}' < /proc/mounts)
do
mountpoint=$(awk -v partition="$partition" '$1 ~ partition { print $2 }' < /proc/mounts)
udisksctl unmount -b $partition
done

udisksctl power-off -b ${device[$number-1]}

sleep 1

notify-send "$util" "${devicelabel[$number-1]} $can_do"

exit 0
usb-detacher2: (вышеупомянутый скрипт переписанный с Yad для более комфортного использования на панели)
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: USB Detacher2
# DESCRIPTION:         GUI скрипт для Caja или кнопка панели - безопастное извлечение USB
# REQUIRES: awk, util-linux, udisks2, yad, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome-colors-common/16x16/actions/media-eject.png

case $LANG in

ru* )
# Russian (ru-RU)
can_t_do="Необнаружено доступных устройств!"
choose_it=" Устройство для извлечения"
drive_no="№"
drive_id="ФС"
drive_size="На"
vendor_model="Имя раздела / Модель"
nothing="Не выбрано USB устройств!"
can_do="может быть извлечён!"
detach="Извлечь"
title="USB Detacher2";;

esac

usbdlist=$(lsblk | grep /media | grep -oP "sd[a-z]" | awk '{print "/dev/"$1}' | sort | uniq | wc -l)
nonusbplist=$(lsblk | grep -v /media | grep -oP "sd[a-z]" | awk '{print "/dev/"$1}' | sort | uniq | wc -l)
nonusbdlist=$[$nonusbplist-$usbdlist]

if [ $usbdlist = 0 ]; then
   notify-send "$title" "$can_t_do"
   exit
fi

declare -a device
declare -a devicesize
declare -a devicelabel
declare -a devicemodel

i=0
for dev in $(lsblk -nl | grep disk | sed 1d | awk '{print "/dev/"$1}' | sort)
do
device[$i]=$dev
devicesize[$i]=$(lsblk $dev -ndo SIZE)
devicelabel[$i]=$(lsblk "$dev"1 -no LABEL)
    devicemodel[$i]=$(lsblk "$dev" -ndo MODEL)
let "i++"
done

if [ $i -eq 0 ]
then
   notify-send "$title" "$can_t_do"
   exit 0
fi

index=`for ((j=$nonusbdlist; j<=i; j++))
do
echo $j
echo ${device[$j-1]}
echo ${devicesize[$j-1]}
echo ${devicelabel[$j-1]} ${devicemodel[$j-1]}
done | yad --list --window-icon=/usr/share/icons/gnome-colors-common/16x16/actions/media-eject.png \
--geometry=250x160-17-26 --borders=10 --buttons-layout=edge --on-top \
--title="$title" --text="$choose_it" --button="gtk-cancel":1 --button="$detach!gtk-ok":0 \
--column="$drive_no":hd --column="$drive_id":hd --column="$drive_size" --column="$vendor_model" --print-column=1`

if [ -z $index ]
then
   notify-send "$title" "$nothing"
   exit 0;
fi

number=$(sed 's/[^1-9]//g' <<< "$index")

for partition in $(awk -v hdd="${device[$number-1]}" '$1 ~ hdd {print $1}' < /proc/mounts)
do
mountpoint=$(awk -v partition="$partition" '$1 ~ partition { print $2 }' < /proc/mounts)
udisksctl unmount -b $partition
done
udisksctl power-off -b ${device[$number-1]}
sleep 1
notify-send "$title" "${devicelabel[$number-1]} $can_do"
exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

#6
CD•DVD_в_ISO: (Добавлено отображение модели привода)
#!/bin/bash

# AUTHOR:    (c) Caio Geraldi Conechoni, deeply modified and translated by Aalexeey :-)
# NAME:    CDtoISO
# DESCRIPTION:     GUI скрипт для dd создающий ISO образ из CD или DVD
# REQUIRES:    dd, mate-dialogs, mate-dialogs-gnome, mate-notification, libnotify-bin
# LICENSE:    GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:    http://www.vivaolinux.com.br/script/Criar-imagem-ISO-a-partir-de-CD , https://debianforum.ru/index.php?topic=9141.0
# ICON_USED:       /usr/share/icons/gnome-colors-common/16x16/apps/rip.png

#Проверка количества примонтированных оптических приводов.
cdmounted=`mount | grep cdrom* | wc -l`

if [ $cdmounted = 0 ]; then
   zenity --warning --text="Нет примонтированных CD"
   exit
fi

if [ $cdmounted -ge 2 ]; then
   zenity --error --text="Оставьте только один \nпримонтированный CD"
   exit
fi

#Выбор каталога для сохранения образа
save_dir=$(zenity --file-selection --directory --title="Где сохраняем ISO образ?");

if [[ "$?" != 0 ]];then
   zenity --info --text="Каталог не выбран....\nCDtoISO остановлен."
   exit 0;
fi

#Выбор примонтированного привода в каталоге /dev
cdchoose=`mount | grep cdrom* | head -c 8`

#Выбор его марки в каталоге /dev/disk/by-id
cdname=`find -L /dev/disk/by-id -samefile $cdchoose | cut -c 21-`
notify-send "CDtoISO" "Привод:  $cdname"

#Считывание имени примонтированного диска
cdlabel=`find -L /dev/disk/by-label -samefile $cdchoose | tr -s '\x20',' ' '_' | tr -d '\' | cut -c 20-`

sleep 2

#Выбор имени и директории сохранения образа
zenity --question --title="Сделайте выбор" --text="Сохранить $cdlabel.iso в \n$save_dir?\n\n<b>Нет</b>, чтобы изменить папку и имя образа.\nНе допускается пробелов в имени файла!\nРасширение ...iso указывать обязательно,\nнапример Very_Large_Bootable_Image.iso"

choice=$?

if [ $choice = 0 ]; then
   output=$save_dir/$cdlabel.iso
   notify-send "CDtoISO" "Инициализация и снятие ISO образа диска,\nвызывает активность оптического привода!"
   sleep 3
#  notify-send "CDtoISO" "Копирование CD или DVD в образ\n$output\nможет занять несколько минут!"
   coproc { echo 0; dd if=$cdchoose of=$output; echo 100; }
   sleep 3
   zenity --progress --pulsate --text=" Создание ISO образа с диска....\n Может занять несколько минут!\n $cdname" --auto-close <&${COPROC[0]} || kill $!
   sleep 2
   notify-send "CDtoISO" "Создание образа завершено или прервано \n$output" &
   killall dd
else
   file=$(zenity --file-selection --save --confirm-overwrite --title="Выбор папки и имени для сохраняемого образа...");
   if [ "$?" = 1 ]; then
      zenity --info --title="Внимание" --text="Каталог не выбран....\nCDtoISO остановлен!"
      exit     
   else
      notify-send "CDtoISO" "Инициализация и снятие ISO образа диска,\nвызывает активность оптического привода!"
      sleep 3
#     notify-send "CDtoISO" "Копирование CD или DVD в образ\n$file\nможет занять несколько минут!" 
      coproc { echo 0; dd if=$cdchoose of=$file; echo 100; }
      sleep 3
      zenity --progress --pulsate --text=" Создание ISO образа с диска....\n Может занять несколько минут!\n $cdname" --auto-close <&${COPROC[0]} || kill $!
      sleep 2                         
      notify-send "CDtoISO" "Создание образа завершено или прервано \n$file" &
      killall dd
   fi
fi
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

#7
°Mount_ISO: (через udisks2, поддержка образов с разделами) (udiskie -2qsA -m flat)
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: Mount ISO
# DESCRIPTION:         GUI скрипт для Caja, примонтирует ISO или IMG образ
# REQUIRES: mkisofs | genisoimage, udisks2, udiskie, mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome/16x16/devices/media-optical.png

case $LANG in

ru* )
# Russian (ru-RU)
util="Mount_ISO"
image_file="Для запуска скрипта выделяйте образ"
no_image="Не был выбран образ диска!"
cancel="Работа скрипта прекращена!"
could_be="Вероятно"
mounted="был примонтирован"
multisub="образ с подразделами!"
noproblem=""
already="Возможно этот образ\nуже примонтирован"
same_id="или <b>ID</b> другого образа\nтот же! <b>Монтируем?</b>";;

esac

imageselect="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
wholename=$(basename "$1")
name=${wholename%.*}
isoid=`isoinfo -ignore-error -d -i $imageselect | grep 'Volume id:' | cut -c 12- | sed -n '$p'`
isoidfind=`mount | grep "$isoid" | wc -l`
isodevfind=`mount | grep $name  | wc -l`
mountscheck=$(($isoidfind + $isodevfind));

if [[ "$*" =~ \.[iI][mM][gG]$ ]]; then
udisksctl loop-setup -rf $imageselect
notify-send "$util" "$could_be $mounted\n IMG $multisub"
exit 0;
fi

if [[ "$mountscheck" != 0 ]] && [[ "$*" =~ \.[iI][sS][oO]$ ]]; then
choice=$((zenity --question --title="$util" --text="$this_iso\n$already\n$same_id" --width=250) && echo "" || echo "exit 0;");
$choice
fi

if [[ "$*" =~ \.[iI][sS][oO]$ ]]; then
dev_loop=`udisksctl loop-setup -rf $imageselect`
sleep 0.5
dev_mask=$(echo $dev_loop | sed 's/^.*\/dev\/loop/loop/ ; s/\..*/*/');
dev_looped=$(echo $dev_loop | sed 's/^.*\/dev\/loop/loop/ ; s/\..*//');
dev_subs=$(find /dev -maxdepth 1 -type b -name "$dev_mask" | sed '$ d ; /[0-9][0-9]$/d');
sleep 0.5
dev_mounted=$(grep "\/dev\/$dev_looped" /proc/mounts | sed -n '/\/dev\/$dev_looped/p');
dev_unmounted=$(echo "$dev_subs" | sed '/$dev_mounted/d ; s/ .*//');
udisksctl mount -b  $dev_unmounted
else
notify-send "$util" "$image_file"
zenity  --warning --title="$util" --text="$no_image\n$cancel" --width=250;
exit -1;
fi

if [ -n "$dev_unmounted" ]; then
notify-send "$util" "$could_be $mounted\n ISO $multisub"
exit
fi

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

#8
¹Список_пакетов: (выводит список установленных пакетов в системе 64 бит)
#!/bin/bash

# AUTHOR:    (c) Aalexeey :-)
# NAME:    Packages_list
# DESCRIPTION:     GUI скрипт для dpkg создающий список пакетов, включая их версию, в системе
# REQUIRES:    dpkg, mate-dialogs | zenity, mate-dialogs-gnome, mate-notification, libnotify-bin
# LICENSE:    GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:    http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:       /usr/share/icons/gnome/16x16/actions/edit-paste.png

case $LANG in

ru* )
# Russian (ru-RU)
util="Packages_list"
choose="Выбор папки и имени списка пакетов..."
attention="Внимание"
list_build=" Создание списка deb пакетов...."
cancel="Каталог не выбран....\nPackages_list остановлен!"
job_done="Список deb пакетов успешно создан в"
job_canceled="Работа скрипта прервана, списка нет!"
job_failed="Что-то пошло не так, списка нет!";;

esac

dpkg -l | cut -c 5- | sed -n '/=======/,$p' | sed -e 's/:amd64 /       /' -e '1s/-//' -e '1s/-.*//' > /tmp/packages_tmp.txt;

packages_width=$(sed -n '1p' /tmp/packages_tmp.txt | wc -m);

save_file=$(zenity --file-selection --save --confirm-overwrite --title="$choose");

if [ "$?" = 1 ]; then
zenity --info --title="$attention" --text="$cancel" &
notify-send "$util" "$job_canceled"
exit 0;     
else
file=$(basename "$save_file");
cat /tmp/packages_tmp.txt | cut -c -"$packages_width" | sed -e '1d' -e 's/[[:space:]]*$//' > $save_file && sleep 2 | zenity --progress --no-cancel --pulsate --text="$list_build" --auto-close --width=300
    sleep 1
rm /tmp/packages_tmp.txt;
    if [ -f "$save_file" ]; then                         
        notify-send "$util" "$job_done\n<b>$file</b>"
        exit 0;
    else
        notify-send "$util" "$job_failed"
    exit 1;
    fi
fi

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

¹Чистить_•desktop'ы: чистит desktop файлы от не Русских локализаций (в папке и по отдельности)
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: Clean_desktops
# DESCRIPTION:          GUI скрипт для Caja, чистит .desktop файлы от ненужных локализаций
# REQUIRES: mate-dialogs-gnome | zenity, mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:            /usr/share/icons/gnome-colors-common/16x16/apps/computerjanitor.png

case $LANG in

ru* )
# Russian (ru-RU)
util="Clean_desktops"
nothing="Ничего не было выбрано"
one_only="Выбирайте один файл\nили папку с файлами,"
terminated="работа скрипта была\nдосрочно прекращена!"
wrong="Неправильный выбор"
cleaning="Вычищаются локализации в .desktop'ах"
single="Один"
done_file="файл проверен и вычищен"
done_files="файл(а) проверено и вычищено"
                job_done="Файл .desktop был\nуспешно вычищен."
jobs_done="Файлы .desktop были\nуспешно вычищены.";;

esac

fileselect="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
desktop=`echo "$fileselect" | sed '/^$/d' | wc -l`
desktops=`cd "$1" && ls -1 *.desktop 2>/dev/null | wc -l`
garbage=$(echo 's/\[ru]=/\(ru)=/g' -e 's/\[ru_RU]=/\(ru_RU)=/g' -e '/\[*]=/d' -e 's/(ru)=/\[ru]=/g' -e 's/(ru_RU)=/\[ru_RU]=/g')

# Если ничего не выбрано то сразу выходим из программы
if [[ "$1" == "" ]]; then
zenity --warning --title="$util" --text="$nothing\n$terminated" --width 250;
exit 0;
fi

if [[ "$desktop" != "1" ]]; then
zenity --warning --title="$util" --text="$one_only\n$terminated" --width 250;
exit 0;
fi

if [ -f "$1" ] && [[ "$1" =~ \.desktop ]]; then
sed -i -e $garbage "$1" && sleep 2 | zenity --progress --no-cancel --pulsate --text="$cleaning" --auto-close --width=300
notify-send "$util" "$single $done_file"
        sleep 1
zenity --info --title="$util" --text="$job_done" --width 250
elif [ "$desktops" != "0" ] && [ -d "$1" ]; then
cd "$1" && sed -i -e $garbage *.desktop && sleep 3 | zenity --progress --no-cancel --pulsate --text="$cleaning" --auto-close --width=300
notify-send "$util" "$desktops $done_files"
sleep 1
zenity --info --title="$util" --text="$jobs_done" --width 250
else
zenity --warning --title="$util" --text="$wrong\n$terminated" --width 250;
exit 0;
fi

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Aalexeey

°Link_здесь: создаёт локальный линк-ссылку на соседний объект
#!/bin/bash

# AUTHOR: (c) Aalexeey :-)
# NAME: Local link
# DESCRIPTION:         GUI скрипт для Caja, делает локальный линк (без полного адреса)
# REQUIRES: mate-notification, libnotify-bin
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:         /usr/share/icons/gnome/16x16/emblems/emblem-symbolic-link.png

case $LANG in

ru* )
# Russian (ru-RU)
util="Локальная ссылка"
attention="Внимание"
nothing="Вы ничего не выбрали!"
cancel="Работа скрипта прекращена!"
job_canceled="Работа скрипта прервана, линка нет!"
same_name="Ссылка не может иметь имя выделенного объекта!"
linkentry="Имя локальной ссылки:";;

esac

#Транслирует пробелы
allnames=$(echo "$1");

#Имя выбранного файла
wholename=$(basename "$allnames");

#Имя файла без расширения (и без точки)
name=${wholename%.*}

#Имя линка по умолчанию
linkname=`basename $name`"_link"

if  [[ "$1" == "" ]]; then
notify-send "$util" "$nothing"
exit 0;
fi

link=$(zenity --entry --title="$util" --entry-text="$linkname" --text="$linkentry" --width=250);
if  [ "$?" = 1 ]; then
zenity --info --title="$attention" --text="$cancel" --width=250 &
notify-send "$util" "$job_canceled"
exit 0;
elif [[ "$link" == "$wholename" ]]; then
zenity --info --title="$attention" --text="$cancel" --width=250 &
notify-send "$util" "$same_name"
exit 0;         
else
    cd "$PWD" && ln -sf "$wholename" "$link"
notify-send "$util" "$link"
exit 0;
fi

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

Anna

Прекрасно! Но Вы не строчки не написали о том,как это использовать. Куда пихать? :)

ChubaDuba


Aalexeey

#13
³acestream_в_http: конвертирует Ace плэйлист в читаемый плэерами http формат
#! /bin/bash

# AUTHOR:       (c) Aalexeey :-)
# NAME:         acestream в http
# DESCRIPTION:  GUI скрипт для Caja - конвертирует плэйлисты Ace Stream в читаемые плэерами
# REQUIRES:     zenity | mate-dialogs-gnome, mate-notification, libnotify-bin
# LICENSE:      GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:      http://debianforum.ru/index.php?topic=9141.0
# ICON_USED:    /usr/share/icons/hicolor/16x16/apps/acestream.png

#Сообщения
case $LANG in

ru* )
# Russian (ru-RU)
util="acestream to http"
playlist="Файл"
nothing="Не выбран Ace m3u(8)"
terminated="работа скрипта была\nдосрочно прекращена!"
error_ace="Движок Ace Stream\nне установлен или\nне был обнаружен."
job_progress="Выполняется конвертация плэйлиста...."
job_done="сохранён.";;

esac

#Имя выбранного файла
wholename=$(basename "$1")

directory=$(pwd)

#Расширение файла (без точки)
extension=${wholename##*.}

#Имя файла без расширения (и без точки)
m3u_file=${wholename%.*}

#Выбор имени сохраняемого файла
suggested_filename="$directory"/"$m3u_file"_http."$extension"

#Проверка acestream ссылок
ace_stream=`grep acestream:// $1 | wc -l`

# Если выделенный файл плэйлист
if [[ "$1" =~ \.[mM][33][uU]$ ]] || [[ "$1" =~ \.[mM][33][uU][88]$ ]] && [ $ace_stream != 0 ]; then
    cp -f $1 $suggested_filename
    sed -i 's#acestream://#http://127.0.0.1:6878/ace/getstream?id=#g' $suggested_filename | sleep 1 |
    zenity --progress --no-cancel --pulsate --text="$job_progress" --auto-close --width=300
    notify-send "$util" "$playlist "$m3u_file"_http."$extension" $job_done"
else
    zenity --warning --title="$util" --text="$nothing\n$terminated" --width 200;
fi

#Проверить установлен ли Ace Stream Engine
ace0="/usr/bin/acestreamengine"
ace1="/usr/share/acestream/acestreamengine"
ace2="/opt/acestream/acestreamengine"
if [ ! -x $ace0 ] && [ ! -e $ace1 ] && [ ! -e $ace2 ]; then
    zenity --info --title="$util" --text="$error_ace" --width=200
fi

exit 0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"