Rating@Mail.ru
IPB
Etersoft - from Windows to Linux
Etersoft
решения для перехода
с Windows на Linux
Дружественные сайты: alv.me и Rus-Linux.net

Здравствуйте, гость ( Вход | Регистрация ) Поиск · 

> 

Темы от студентов с запросами готовых решений по заданиям закрываются не глядя.

 
Reply to this topic Start new topic
> Полезные советы и скрипты, упрощающие работу в консоли
/dev/random
Oct 17 2009, в 03:26
Сообщение #1



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

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

Начну с собственного. Я это уже как-то в одной флеймовой теме приводил, но неплохо бы здесь продублировать.
Иногда в процессе работы (обычно при распаковке архивов) возникают файлы с невводимыми именами. Например, в неизвестной кодировке, или же просто "битые". Что с ними делать, как удалить/переименовать? Большинство для этого запускает 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


Спасибо сказали:
Go to the top of the page
 
+Quote Post
/dev/random
Nov 16 2009, в 12:48
Сообщение #2



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

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

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

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


Спасибо сказали:
Go to the top of the page
 
+Quote Post
drBatty
Nov 16 2009, в 14:27
Сообщение #3


GPG ID: 4DFBD1D6 дом горит, козёл не видит...
Иконка группы

Сообщений: 8735

Вставить имя   :   Цитата

ОС: Slackware-current
Город: Петербург

Группа: Участники

Цитата(/dev/random @ 16th November 2009 - в 13:48) *
Однако можно поступить гораздо проще. Достаточно внимательно прочитать описание опции -L в man find.

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

безусловно.


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

Скоро придёт
Осень
Go to the top of the page
 
+Quote Post
/dev/random
Nov 16 2009, в 14:32
Сообщение #4



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

Автор темы
Цитата(drBatty @ Nov 16 2009, в 14:27) *
что-то в слаке 10.2 я не нашёл такой опции sad.gif

В самом начале секции OPTIONS идёт текст: "The -H, -L and -P options..."
Go to the top of the page
 
+Quote Post
drBatty
Nov 16 2009, в 15:40
Сообщение #5


GPG ID: 4DFBD1D6 дом горит, козёл не видит...
Иконка группы

Сообщений: 8735

Вставить имя   :   Цитата

ОС: Slackware-current
Город: Петербург

Группа: Участники

Цитата(/dev/random @ 16th November 2009 - в 15:32) *
В самом начале секции OPTIONS идёт текст: "The -H, -L and -P options..."

в 12йидёт, а в 10 вроде-бы не было :(
что-то у меня так не получилось...


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

Скоро придёт
Осень
Go to the top of the page
 
+Quote Post
t.t
Nov 17 2009, в 11:36
Сообщение #6


думающий о вечном
Иконка группы

Сообщений: 7389

Вставить имя   :   Цитата

ОС: Debian, LMDE

Группа: Модераторы разделов

Кстати о "некоторые для этого пишут целые скрипты".. Вчера наткнулся на необходимость заменить все пробелы в именах файлов; проблема в том, что пробелы могут быть и в именах каталогов, потому простой 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нεиж
Go to the top of the page
 
+Quote Post
/dev/random
Nov 17 2009, в 11:50
Сообщение #7



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

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

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


Спасибо сказали:
Go to the top of the page
 
+Quote Post
SLEDopit
Nov 17 2009, в 13:57
Сообщение #8


фанат консоли (=
Иконка группы

Сообщений: 4357

Вставить имя   :   Цитата

ОС: GNU/Debian, RHEL

Группа: Модераторы разделов

Цитата(/dev/random @ 17th October 2009 - в 03: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.
Go to the top of the page
 
+Quote Post
/dev/random
Nov 17 2009, в 14:50
Сообщение #9



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

Автор темы
Цитата(SLEDopit @ Nov 17 2009, в 13:57) *
а как же автодополнение?

Автодополнение не поможет, если из "вводимых" символов только пробелы.
Go to the top of the page
 
+Quote Post
t.t
Nov 17 2009, в 19:12
Сообщение #10


думающий о вечном
Иконка группы

Сообщений: 7389

Вставить имя   :   Цитата

ОС: Debian, LMDE

Группа: Модераторы разделов

Цитата(/dev/random @ Nov 17 2009, в 14:50) *
Цитата(SLEDopit @ Nov 17 2009, в 13:57) *
а как же автодополнение?

Автодополнение не поможет, если из "вводимых" символов только пробелы.
Да даже если первые же различающиеся символы -- битые, уже не поможет. В частности, если битые первые символы имён.


--------------------
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Go to the top of the page
 
+Quote Post
alexandrdors
Dec 4 2009, в 19:27
Сообщение #11


Прохожий
Иконка группы

Сообщений: 7

Вставить имя   :   Цитата

ОС: mandriva 2007 power pack
Город: novosibirsk

Группа: Участники

Быстрая установка 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)

Взято отсюда.


--------------------
Go to the top of the page
 
+Quote Post
drBatty
Dec 9 2009, в 19:10
Сообщение #12


GPG ID: 4DFBD1D6 дом горит, козёл не видит...
Иконка группы

Сообщений: 8735

Вставить имя   :   Цитата

ОС: Slackware-current
Город: Петербург

Группа: Участники

Цитата(/dev/random @ 17th October 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

Скоро придёт
Осень
Go to the top of the page
 
+Quote Post
ZyX
Feb 10 2010, в 03:55
Сообщение #13


Бывалый
Иконка группы

Сообщений: 351

Вставить имя   :   Цитата

ОС: Gentoo
Город: Москва

Группа: Участники

Цитата(/dev/random @ Nov 17 2009, в 14:50) *
Цитата(SLEDopit @ Nov 17 2009, в 13:57) *
а как же автодополнение?

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

Зависит от оболочки и её настроек. У меня в zsh достаточно нажать два раза Tab
и добраться до нужного файла тем же Tab’ом или же стрелками.
Go to the top of the page
 
+Quote Post
QWERTYASDF
Oct 19 2015, в 15:04
Сообщение #14


Чайник со свистком
Иконка группы

Сообщений: 689

Вставить имя   :   Цитата

ОС: GNU/Linux

Группа: Участники

А еще полезные рецепты будут? ☺
Go to the top of the page
 
+Quote Post
QWERTYASDF
Oct 25 2015, в 02:26
Сообщение #15


Чайник со свистком
Иконка группы

Сообщений: 689

Вставить имя   :   Цитата

ОС: GNU/Linux

Группа: Участники

Цитата(/dev/random @ Oct 17 2009, в 03: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


ЧЯДНТ?
Go to the top of the page
 
+Quote Post
/dev/random
Oct 25 2015, в 08:19
Сообщение #16



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

Автор темы
Цитата(QWERTYASDF @ Oct 25 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 нужен был всегда, но я точно помню, что функцией я пользовался по назначению, и она работала.


Спасибо сказали:
Go to the top of the page
 
+Quote Post
bormant
Oct 25 2015, в 10:51
Сообщение #17


Свой человек
Иконка группы

Сообщений: 1091

Вставить имя   :   Цитата

Группа: Участники

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


Спасибо сказали:
Go to the top of the page
 
+Quote Post
/dev/random
Oct 25 2015, в 11:49
Сообщение #18



Иконка группы

Сообщений: 4382

Вставить имя   :   Цитата

ОС: Gentoo
Город: Волгоград

Группа: Админы

Автор темы
Цитата(bormant @ Oct 25 2015, в 10:51) *
Как по мне, проще "ls -i" плюс "find . -maxdepth 1 -inum ... -delete".

Поскольку вы уже не первый, кто это предлагает, вписал в стартовый пост.
Go to the top of the page
 
+Quote Post
ormorph
Jan 29 2018, в 11:47
Сообщение #19


Знаток линукса
Иконка группы

Сообщений: 510

Вставить имя   :   Цитата

ОС: Gentoo

Группа: Участники

Скрипт предназначенный для отправления компьютер в спящий режим, и обеспечивающий его просыпание определенного числа в определенное время, и запускающий какое нибудь приложение либо скрипт при просыпании.
Для работы использует диалог 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.
Go to the top of the page
 
+Quote Post

 Reply to this topic Start new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 22nd February 2018 - в 11:59




Rating@Mail.ru