Полезные советы и скрипты (упрощающие работу в консоли)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Полезные советы и скрипты

Сообщение /dev/random » 17.10.2009 04:26

Предлагаю в эту тему выписывать свои интересные находки в области шелл-скриптинга и просто полезные скрипты.

Начну с собственного. Я это уже как-то в одной флеймовой теме приводил, но неплохо бы здесь продублировать.
Иногда в процессе работы (обычно при распаковке архивов) возникают файлы с невводимыми именами. Например, в неизвестной кодировке, или же просто "битые". Что с ними делать, как удалить/переименовать? Большинство для этого запускает mc или даже переключается в gui. Но это, во-первых, неудобно, а во-вторых, не всегда доступно.
Есть другое решение. Просто держите в своём bashrc такую функцию:

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

lsn() {
  while read num name
  do
    declare -g "LS$num=$name"
  done <<<"$(ls -A1 "$@" | cat -n | tee /dev/stderr)"
}

Эта функция выведет _пронумерованный_ список всех файлов в текущем (или в заданном) каталоге и присвоит их имена переменным LS1, LS2, ...
После этого ищем в списке "плохой" файл и вводим, скажем, rm "$LS12"

PS: вот уже два человека предложили один и тот же альтернативный вариант:

$ ls -i 70266797 filename $ find . -maxdepth 1 -inum 70266797 -delete

Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение /dev/random » 16.11.2009 12:48

Для поиска и удаления битых симлинков некоторые, как выяснилось, пишут целые скрипты, определяющие, является ли ссылка битой, с помощью утилиты file (см., например, здесь).
Однако можно поступить гораздо проще. Достаточно внимательно прочитать описание опции -L в man find.

find -L / -type l -exec rm -i {} \;

upd: И аккуратнее с /proc. Там по определению полно битых ссылок. Возможно, чем нажимать кучу раз n, будет удобнее добавить перед -exec'ом -not -path '/proc*'
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Полезные советы и скрипты

Сообщение drBatty » 16.11.2009 14:27

/dev/random писал(а):
16.11.2009 12:48
Однако можно поступить гораздо проще. Достаточно внимательно прочитать описание опции -L в man find.

что-то в слаке 10.2 я не нашёл такой опции :(
/dev/random писал(а):
16.11.2009 12:48
upd: И аккуратнее с /proc. Там по определению полно битых ссылок. Возможно, чем нажимать кучу раз n, будет удобнее добавить перед -exec'ом -not -path '/proc*'

безусловно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение /dev/random » 16.11.2009 14:32

drBatty писал(а):
16.11.2009 14:27
что-то в слаке 10.2 я не нашёл такой опции :(

В самом начале секции OPTIONS идёт текст: "The -H, -L and -P options..."
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Полезные советы и скрипты

Сообщение drBatty » 16.11.2009 15:40

/dev/random писал(а):
16.11.2009 14:32
В самом начале секции OPTIONS идёт текст: "The -H, -L and -P options..."

в 12йидёт, а в 10 вроде-бы не было :(
что-то у меня так не получилось...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Полезные советы и скрипты

Сообщение t.t » 17.11.2009 11:36

Кстати о "некоторые для этого пишут целые скрипты".. Вчера наткнулся на необходимость заменить все пробелы в именах файлов; проблема в том, что пробелы могут быть и в именах каталогов, потому простой find "* *" -print0 | xargs -0 rename 's/ /_/g' не сработает. И вспомнил, что когда-то я сам здесь об этом и писал (а изначально в той теме и был приведен скрипт на несколько строк):

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

find -name "* *" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr ' ' _)"; done
Обратная сортировка гарантирует, что любое имя типа "dir/dir 2/file name" будет обрабатываться раньше, чем "dir/dir 2/".
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение /dev/random » 17.11.2009 11:50

t.t писал(а):
17.11.2009 11:36
Обратная сортировка гарантирует, что любое имя типа "dir/dir 2/file name" будет обрабатываться раньше, чем "dir/dir 2/".

Можно без обратной сортировки: в find есть опция -depth, предназначенная именно для этого.
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4626
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Полезные советы и скрипты

Сообщение SLEDopit » 17.11.2009 13:57

/dev/random писал(а):
17.10.2009 04:26
Что с ними делать, как удалить/переименовать?
а как же автодополнение?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение /dev/random » 17.11.2009 14:50

SLEDopit писал(а):
17.11.2009 13:57
а как же автодополнение?

Автодополнение не поможет, если из "вводимых" символов только пробелы.
Спасибо сказали:

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Полезные советы и скрипты

Сообщение t.t » 17.11.2009 19:12

/dev/random писал(а):
17.11.2009 14:50
SLEDopit писал(а):
17.11.2009 13:57
а как же автодополнение?

Автодополнение не поможет, если из "вводимых" символов только пробелы.
Да даже если первые же различающиеся символы -- битые, уже не поможет. В частности, если битые первые символы имён.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:

alexandrdors
Сообщения: 7
ОС: mandriva 2007 power pack

Re: Полезные советы и скрипты

Сообщение alexandrdors » 04.12.2009 19:27

Быстрая установка Wembmin и его репозитория на CentOS (для последующего обновления вместе с системой)
Скопировать и вставить в терминал:

(echo "[Webmin]
name=Webmin Distribution Neutral
baseurl=http://download.webmin.com/download/yum
enabled=1" >/etc/yum.repos.d/webmin.repo
rpm --import http://www.webmin.com/jcameron-key.asc
yum -y install webmin)

Взято отсюда.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Полезные советы и скрипты

Сообщение drBatty » 09.12.2009 19:10

/dev/random писал(а):
17.10.2009 04:26
Иногда в процессе работы (обычно при распаковке архивов) возникают файлы с невводимыми именами.

Есть альтернативный вариант:
1) сначала смотрим какой inode у файла

$ ls -i 492024 TV.tar.bz2

2) затем ищем файл с таким inode, и удаляем/переименовываем/ещё чего-нибудь (я просто выполнил команду file)

$ find . -inum 492024 -exec file {} \; ./TV.tar.bz2: bzip2 compressed data, block size = 900k
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ZyX » 10.02.2010 03:55

/dev/random писал(а):
17.11.2009 14:50
SLEDopit писал(а):
17.11.2009 13:57
а как же автодополнение?

Автодополнение не поможет, если из "вводимых" символов только пробелы.

Зависит от оболочки и её настроек. У меня в zsh достаточно нажать два раза Tab
и добраться до нужного файла тем же Tab’ом или же стрелками.
Спасибо сказали:

QWERTYASDF
Сообщения: 874
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Полезные советы и скрипты

Сообщение QWERTYASDF » 19.10.2015 15:04

А еще полезные рецепты будут? ☺
Спасибо сказали:

QWERTYASDF
Сообщения: 874
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Полезные советы и скрипты

Сообщение QWERTYASDF » 25.10.2015 02:26

/dev/random писал(а):
17.10.2009 04:26
Иногда в процессе работы (обычно при распаковке архивов) возникают файлы с невводимыми именами. Например, в неизвестной кодировке, или же просто "битые". Что с ними делать, как удалить/переименовать? Большинство для этого запускает mc или даже переключается в gui. Но это, во-первых, неудобно, а во-вторых, не всегда доступно.
Есть другое решение. Просто держите в своём bashrc такую функцию:

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

lsn() {
  while read num name
  do
    declare "LS$num=$name"
  done <<<"$(ls -A1 "$@" | cat -n | tee /dev/stderr)"
}

Эта функция выведет _пронумерованный_ список всех файлов в текущем (или в заданном) каталоге и присвоит их имена переменным LS1, LS2, ...
После этого ищем в списке "плохой" файл и вводим, скажем, rm "$LS12"


Захотелось вот ради интереса наконец воспользоваться данной функцией.

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

$touch {file1,file2,file3}

$ls
file1  file2  file3

$lsn
     1  file1
     2  file2
     3  file3

$rm "$LS1"
rm: невозможно удалить «»: Нет такого файла или каталога

$echo $LS2 | wc -m
1


ЧЯДНТ?
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение /dev/random » 25.10.2015 08:19

QWERTYASDF писал(а):
25.10.2015 02:26
Захотелось вот ради интереса наконец воспользоваться данной функцией.

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

$touch {file1,file2,file3}

$ls
file1  file2  file3

$lsn
     1  file1
     2  file2
     3  file3

$rm "$LS1"
rm: невозможно удалить «»: Нет такого файла или каталога

$echo $LS2 | wc -m
1


ЧЯДНТ?

Баш с тех пор, по-видимому, немного изменился. Теперь к declare нужно добавлять -g. Сейчас изменю пост.

PS: Вообще, странно. Мне почему-то сейчас кажется, что -g нужен был всегда, но я точно помню, что функцией я пользовался по назначению, и она работала.
Спасибо сказали:

Аватара пользователя
bormant
Сообщения: 1161

Re: Полезные советы и скрипты

Сообщение bormant » 25.10.2015 10:51

Как по мне, проще "ls -i" плюс "find . -maxdepth 1 -inum ... -delete".
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение /dev/random » 25.10.2015 11:49

bormant писал(а):
25.10.2015 10:51
Как по мне, проще "ls -i" плюс "find . -maxdepth 1 -inum ... -delete".

Поскольку вы уже не первый, кто это предлагает, вписал в стартовый пост.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 707
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph » 29.01.2018 11:47

Скрипт предназначенный для отправления компьютер в спящий режим, и обеспечивающий его просыпание определенного числа в определенное время, и запускающий какое нибудь приложение либо скрипт при просыпании.
Для работы использует диалог yad либо zenity и утилиту rtcwake.
За выбор режима засыпания отвечает переменная SUSP, т.е. засыпание с сохранением на диск или с сохранением в оперативную память.

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

#!/bin/bash

#######
## Выбор режима засыпания
#######

#SUSP=$1

## Засыпание с сохранением в оперативную память.
#SUSP=mem

## Засыпание с сохранением на диск.
SUSP=disk

# Выбор диалога
#DIALOG=zenity
DIALOG=yad

ENV_CALLENDAR="$($DIALOG --calendar)"
if [ "$?" -eq "1" ] ; then exit 0
fi

MASS_DATE=($(echo $ENV_CALLENDAR|sed 's/\./ /g'))

tm="$($DIALOG --entry \
        --title="Время подъема!" \
        --text="Введите время формат 00:00" \
        --entry-text "00:00")"

if [ "$?" -eq "1" ] ; then exit 0
fi

# Проверка формата времени 16:41
if [[ "$tm" == [0-9]:[0-9][0-9] ]] || [[ "$tm" == [0-9][0-9]:[0-9][0-9] ]] ; then
    tm=$tm
else
    $DIALOG --info \
      --text="Неверный формат времени" &&
    exit 0
fi

date1=$(date -d "${MASS_DATE[1]}/${MASS_DATE[0]}/${MASS_DATE[2]} $tm" +%s)

if [[ $date1 > `date -u +%s` ]] ; then
    date=$(echo $[$date1-`date -u +%s`])
else
    $DIALOG --info \
      --text="Это время уже прошло!"
    exit 0
fi

# Выбор скрипта запуска
cd ~/bin
SCRIPTS="$($DIALOG --title="Выбор скрипта!" \
        --text="Выберите файл!" \
        --file-selection)"

if [ "$?" -eq "1" ] ; then
    SCRIPTS="$HOME/bin/tmplayer.sh"
fi

# засыпаем
sudo rtcwake -m $SUSP -s $date

$SCRIPTS

exit 0

После выбора даты и времени появляется диалог выбора файла скрипта, который будет запускаться при пробуждении, если нажать отмена, то по умолчанию используется скрипт запускающий случайную мелодию с постепенным увеличением громкости ~/bin/tmplayer.sh:

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

#!/bin/bash

# Выбор плеера
#PLAYER=mplayer
PLAYER=mpv

# Выбор диалога
#DIALOG=zenity
DIALOG=yad

# громкость
volume=10
volume_max=80

# Тут должен быть указан ваш каталог с музыкой!
folder=~/"Documents/MY/MUSIC/chingishan/"

player_start()

{
    # убиваем все процессы player-а
    kill -9 $(pidof $PLAYER) &>/dev/null
    # включаем случайную мелодию с бесконечным повтором
    if [ -z "$1" ] ; then
        $PLAYER -loop 0 -shuffle "$folder"* &> /dev/null &
    fi
}

# устанавливаем громкость
amixer -q set Master $volume%

player_start

# повышаем уровень громкости
for (( volume=$volume; volume<$volume_max; volume++ )); do
    amixer sset Master 1%+ &> /dev/null
    sleep 1 # задержка повышения громкости
done &

$DIALOG --info --text="Отключить будильник"

player_start false
exit 0


У меня этот скрипт навешен на отдельный пункт меню в Openbox, в последнее время использую с сохранением на диск, довольно хорошо помогает когда в Gentoo идет полная пере сборка мира, отправить комп в сон и пробудить в определенное время.

При желании можно выкладывать интересные скрипты обеспечивающие определенную автоматизацию, и которые можно использовать совместно с данным скриптом.
Зы: Утилите rtcwake должны быть даны права root, строчка

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

user ALL=NOPASSWD: /usr/sbin/rtcwake
в /etc/sudoers.
Спасибо сказали: