реальные задачи на bash (киньте линк, или дайти ваши :))

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

Модераторы: /dev/random, Модераторы разделов

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

Re: реальные задачи на bash

Сообщение SantaClausRpm »

1. Мониторинг свободного дискового пространства, как только занятость достигает 99% или выше - емайл админу.
2. Мониторинг сайта, постановку задачи см. здесь http://sysadminonline.ru/prostoy-skript-mo...inga-veb-sayta/ (там же и ответ ;)
In FOSS we trust
Спасибо сказали:
Аватара пользователя
fox-contra
Сообщения: 33

Re: реальные задачи на bash

Сообщение fox-contra »

dr-evil писал(а):
31.10.2008 18:26
man find

М-дя. Слона-то я и не того... А я сижу man ls читаю... :)
Спасибо!
Спасибо сказали:
curtdp
Сообщения: 1
ОС: Windows, Ubuntu

Re: реальные задачи на bash

Сообщение curtdp »

Парни, если тема жива - помогите решить задачу, очень прикладная :)

Есть хостинг с кучей сайтов на одинаковой CMS, по нему прошелся вирус и подобавлял в index.php (бывает и в другие файлы) свой злобный код.
Задача - пройтись по всем папкам с сайтами найти все файлы по заданным условиям, имя (например тот же index.php или home.php - желательно чтоб было понятно как поменять :) ) найти в этих файлах зловредный код и удалить его (этот код, а не файл целиком :) )

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

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

Re: реальные задачи на bash

Сообщение drBatty »

curtdp писал(а):
19.05.2009 00:07
Еще вариант, есть все тот же хост с кучей сайтов, обновляется движок сайта, я заливаю архив на сервер, нужно пройтись по всем папкам и распаковать туда этот архив, естественно заныриваем в папку на 1 уровень, без рекурсий

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

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

sed 'что ищем в тексте и как исправляем' -i *.php


Да. для поиска логично юзать find
Однако я часто использую связку ls+sed(первая даёт список файлов, вторая отбирает нужные)
sed может запустить другую sed для того что-бы отредактировать нужный файл( s/ / /e )
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: реальные задачи на bash

Сообщение butch »

drBatty писал(а):
19.05.2009 10:00
ls+sed

плоха и неправлильно использовать ls для получения списка файлов.
можно натолкнуться на такие грабли как:
=пробелы в файлах будут восприняты как разделители имен файлов
=файлы, начинающиеся с - могут быть восприняты как опции для других команд ;)
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: реальные задачи на bash

Сообщение diesel »

butch писал(а):
19.05.2009 10:10
drBatty писал(а):
19.05.2009 10:00
ls+sed

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

вас обманули, ls как раз и является командой для получения списка файлов :) а насколько правильно вы будете использовать список файлов в дальнейшем - это уже проблема несколько другого рода.

butch писал(а):
19.05.2009 10:10
можно натолкнуться на такие грабли как:
=пробелы в файлах будут восприняты как разделители имен файлов

sed тут непричём, ls тоже

butch писал(а):
19.05.2009 10:10
=файлы, начинающиеся с - могут быть восприняты как опции для других команд ;)

подобные файлы доводилось видеть всего несколько раз, что в пределах статистической погрешности в сравнении с общим количеством - и в принципе если их надо тоже обработать, то легко можно сделать, опять же ls тут не причём.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: реальные задачи на bash

Сообщение butch »

diesel писал(а):
19.05.2009 11:45
подобные файлы доводилось видеть всего несколько раз, что в пределах статистической погрешности в сравнении с общим количеством

вы молодец =))))
так же можно по статистике прикинуть, сколько кирпичей падает на головы строителям, после чего отказаться от касок =))))

diesel писал(а):
19.05.2009 11:45
ls как раз и является командой для получения списка файлов

замечаетльный пример из часто встречаемых ошибок (самый первый)

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

Re: реальные задачи на bash

Сообщение drBatty »

butch писал(а):
19.05.2009 10:10
плоха и неправлильно использовать ls для получения списка файлов.

а я использую. и ни на какие грабли не натыкаюсь ;)
Уважаемый diesel уже ответил почему.
Что до пробелов и минусов, дык их можно и нужно экранировать силами той-же sed, что я успешно и делаю(это же касается звёздочек и т.д.)
Что до find, то там граблей тоже много, и ман длинный и не понятный. Пока я в find вижу всего 1 преимущество: можно искать файлы по времени, а то sed считать не умеет, найти файл за 14 мая может, а вот те что младше 1 часа - проблема... Тоже можно, только сложно больно.
За то sed может выполнить любые, самые запутанные сценарии, вроде удаления файлов с нечётным именем:
Алла
Лена
Маша
Яна
Как удалить файлы Алла и Маша? ;)
ну это так, первое что в голову взбрело...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: реальные задачи на bash

Сообщение diesel »

butch писал(а):
19.05.2009 12:03
diesel писал(а):
19.05.2009 11:45
подобные файлы доводилось видеть всего несколько раз, что в пределах статистической погрешности в сравнении с общим количеством

вы молодец =))))
так же можно по статистике прикинуть, сколько кирпичей падает на головы строителям, после чего отказаться от касок =))))

ладно, вот вам эксперимент:

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

diesel@debian:/tmp/tmpc$ ls
file  -file
diesel@debian:/tmp/tmpc$ for i in *; do sed -i -r -e '/^$/d' "$i"; done
sed: couldn't open file ile: No such file or directory
diesel@debian:/tmp/tmpc$ for i in `ls`; do sed -i -r -e '/^$/d' "$i"; done
sed: couldn't open file ile: No such file or directory

потому как дело не в ls, а в:

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

diesel@debian:/tmp/tmpc$ for i in *; do sed -i -r -e '/^$/d' -- "$i"; done
diesel@debian:/tmp/tmpc$ for i in `ls`; do sed -i -r -e '/^$/d' -- "$i"; done
diesel@debian:/tmp/tmpc$

более другой вариант для этого:

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

diesel@debian:/tmp/tmpc$ find -type f -exec sed -i -r -e '/^$/d' {} \;
diesel@debian:/tmp/tmpc$

но он не всегда удобен.

Внимание вопрос, как часто вы отделяете опции команды от имен файлов с помощью "--"? речь идет не только о sed, а о любой команде, которая хочет иметь имя файла на входе. правильно, "почти никогда" :)

butch писал(а):
19.05.2009 12:03
diesel писал(а):
19.05.2009 11:45
ls как раз и является командой для получения списка файлов

замечаетльный пример из часто встречаемых ошибок (самый первый)

кнчно можно использовать и ls =) но вот только нужно очень многие вещи предусмотреть

эта ошибка означает "не используйте ls в for", а не "не используйте ls совсем" - это разные вещи. конструкцию типа ls | while read i; do ... никто не отменял, и она работает в 99% случаев. та доля процента в случае которой оно может глючить мне пока не встречалась _совсем_.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: реальные задачи на bash

Сообщение drBatty »

butch писал(а):
19.05.2009 12:03
кнчно можно использовать и ls =) но вот только нужно очень многие вещи предусмотреть

ну и шутки у вас...
я не стал удалять, я решил переименовать файлы. Проблема вовсе не в ls и не в sed!
они как раз минусы отлично обработали. А вот для mv пришлось доки почитать, как такое переименовывать...
Оказалось - очень просто:

Shell

$ ls -1 Алла -Зина Лена Маша Наташа или Натали Яна $ ls | sed = | sed -r 'N; s/[] ()*]/\\&/g; s/([0-9]+)\n(.+)/\2 \1_\2/; s/^-/-- -/; s/.+/mv &/e' $ ls -1 1_Алла 2_-Зина 3_Лена 4_Маша 5_Наташа или Натали 6_Яна

просто надо вставить перед файлом с - в начале --, и все дела... Но вот тех, кто такие файлы создаёт, поубивал бы :)
впрочем, я ведь могу и ls -i юзать ;)

Без минусов намного проще:
ls | sed = | sed -r 'N; s/[] ()*]/\\&/g; s/([0-9]+)\n(.+)/mv \2 \1_\2/e'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: реальные задачи на bash

Сообщение drBatty »

diesel писал(а):
19.05.2009 12:26
эта ошибка означает "не используйте ls в for"

можно и в for... проблема в том, что вообще-то ls разделяет файлы \n, а вот for считает что аргументы разделены $IFS, которая равна \x20 \x09 \x0a, потому и делит for не только по \n но и по пробелам. Но причём тут for??

давайте ещё такие файлы насоздаём, а потом будем удивляться!?

Shell

$ ll итого 0 -rw-r--r-- 1 doc doc 0 2009-05-19 13:33 -rw-r--r-- 1 doc doc 0 2009-05-19 13:33 *
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: реальные задачи на bash

Сообщение watashiwa_daredeska »

diesel писал(а):
19.05.2009 12:26
конструкцию типа ls | while read i; do ... никто не отменял, и она работает в 99% случаев. та доля процента в случае которой оно может глючить мне пока не встречалась _совсем_.
На случай, если встретится:

bash+GNU tools

$ touch $'\e[31mцветной\e[0m файл с %s, \'" и\nв две строки' $ ls $ ls --quoting-style=c |sed 's/%/%%/g' |while read -r n; do arg=$(eval printf $n); echo "$arg"; done
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: реальные задачи на bash

Сообщение diesel »

watashiwa_daredeska писал(а):
19.05.2009 13:30
diesel писал(а):
19.05.2009 12:26
конструкцию типа ls | while read i; do ... никто не отменял, и она работает в 99% случаев. та доля процента в случае которой оно может глючить мне пока не встречалась _совсем_.
На случай, если встретится:

bash+GNU tools

$ touch $'\e[31mцветной\e[0m файл с %s, \'" и\nв две строки' $ ls $ ls --quoting-style=c |sed 's/%/%%/g' |while read -r n; do arg=$(eval printf $n); echo "$arg"; done


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

Re: реальные задачи на bash

Сообщение drBatty »

watashiwa_darede... писал(а):
19.05.2009 13:30
touch $'\e[31mцветной\e[0m файл с %s, \'" и\nв две строки'

да вроде любые можно символы в имени. кроме \x00

diesel писал(а):
19.05.2009 13:34
гы smile.gif спасибо, про --quoting-style=c не знал

я тоже...
понравилось $ ls --quoting-style=escape
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: реальные задачи на bash

Сообщение butch »

diesel писал(а):
19.05.2009 12:26
та доля процента в случае которой оно может глючить мне пока не встречалась _совсем_.

мы всетаки говорим о том, как правильно, или о том как мы делаем в повседневной жизни?
детей вот мы учим переходить на зеленый. а сами дорогу перебегаем как прийдется =) и так и так делают. но это не значит что и так и так - правильно.
да и примеры ваши ls не используют =)) а про двойной дефис кнчно верно отмечено.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: реальные задачи на bash

Сообщение diesel »

butch писал(а):
19.05.2009 14:11
diesel писал(а):
19.05.2009 12:26
та доля процента в случае которой оно может глючить мне пока не встречалась _совсем_.

мы всетаки говорим о том, как правильно, или о том как мы делаем в повседневной жизни?

говорить о shell'е и забывать о повседневной жизни - глупо :) потому что "правильно" в приложении к shell'у - это понимать что ты пишешь, и к какой реакции это приведет в данном конкретном случае, на данной конкретной задаче. потому что если, скажем, мой скрипт будет расчитан на то что в именах файлов нет пробелов, а они там вдруг есть, то проблемой может оказаться не то что скрипт стал неработоспособным на этих данных, а то что данные некорректны. То есть не воспринимать как догму примеры а-ля cookbook на хабре, а понимать почему это может не сработать, и что с этим делать.

Вам, например, рассказали, что for `ls`; do - это плохо, потому что в именах файлах могут быть пробелы, и рассказали что for *; do - это хорошо потому что проблемы пробелов можно избежать. Но вот незадача, хочется получать список файлов не от команды ls, а от другой команды... идеологически верный вариант будет? - если да - подставьте в него вместо той другой команды ls, и попытайтесь объяснить почему ls там нельзя (:

butch писал(а):
19.05.2009 14:11
да и примеры ваши ls не используют =)) а про двойной дефис кнчно верно отмечено.

используют, там два цикла for, которые в данной ситуации ведут себя абсолютно одинаково, хотя в одном из них таки ls.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: реальные задачи на bash

Сообщение watashiwa_daredeska »

drBatty писал(а):
19.05.2009 13:42
да вроде любые можно символы в имени. кроме \x00
и кроме '/'. Идея была в том, чтобы показать, что можно работать с файлами достаточно универсально, не закладывая в скрипты грабли в виде неумения работать с пробелами, кавычками и прочими спец. символами.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: реальные задачи на bash

Сообщение butch »

diesel писал(а):
19.05.2009 14:54
хочется получать список файлов не от команды ls, а от другой команды... идеологически верный вариант будет?

вы почему то считаете, что я только носом тыкнутый в какое то правило способен иго применять. и шаг влево - и я уже теряюсь =))
ls - частности =)
я вот щас свои скрипты, написанные более года назад, переписываю =)) задачи хоть и тривиальные. но это не значит что не нужно предусматривать разные ситуации..
в общем дальше - флейм =)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: реальные задачи на bash

Сообщение drBatty »

butch писал(а):
19.05.2009 14:11
мы всетаки говорим о том, как правильно, или о том как мы делаем в повседневной жизни?
детей вот мы учим переходить на зеленый. а сами дорогу перебегаем как прийдется =) и так и так делают. но это не значит что и так и так - правильно.

ну вы предлагаете мне учить сына правильно биться головой об стену?! типа - "в жизни всё пригодится"? не должно быть таких файлов. Правильно - самому таких файлов не создавать, ОС их и так не создаёт(правильно настроенная), а если они берутся откуда-то из вне, например из ED2K, то их надо прямо там и переименовывать, как скачаются(или ещё раньше). Тогда будет всё хорошо.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: реальные задачи на bash

Сообщение butch »

оффтоп
drBatty писал(а):
19.05.2009 15:19
ну вы предлагаете мне учить сына правильно биться головой об стену?!

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

Re: реальные задачи на bash

Сообщение drBatty »

watashiwa_darede... писал(а):
19.05.2009 15:13
и кроме '/'. Идея была в том, чтобы показать, что можно работать с файлами достаточно универсально, не закладывая в скрипты грабли в виде неумения работать с пробелами, кавычками и прочими спец. символами.
У вас слишком сложно...
В нашем примитивном случае это оправданно, однако если всё так писать, то скрипты будут огромными, не понимаемыми, и следовательно - с ошибками. (В книжках про надёжное программирование это уже, как я понял, доказано, жаль книжку найти не могу...)
К тому-же, с вашим подходом возможны другие(возможно более опасные) грабли - совместимость. Вот, в новой sed уже есть новая команда z, вот только у меня ещё старая. Да и у вас наверное тоже. Не факт, что используемые вами дополнительные возможности есть у всех. Потому ваш скрипт может вообще не сработать во многих системах(причём не факт, что область систем которые не поддерживаются вашим скриптом меньше). Хотя конечно спасибо, ваш подход тоже очень полезен.

butch писал(а):
19.05.2009 15:16
задачи хоть и тривиальные. но это не значит что не нужно предусматривать разные ситуации..
в общем дальше - флейм =)
грабли можно обходить по разному. имя - это всего-лишь атрибут файла, его используют для массовой обработки файлов, с одним файлом можно и без имени работать, по inode к примеру. Ничего странного, если мы пытаемся использовать кривые атрибуты, в конце концов, ни один из ваших скриптов не прочитает файл с правами 000, вы же не считаете это недостатком скрипта? Так и с именем - если кто-то или что-то создаёт такие файлы, то нужно либо отказаться от этого, либо настроить это, либо переименовывать такое, как выше было написано watashiwa_darede... или по inode.


butch писал(а):
19.05.2009 15:37
а что, взрослая подающая пример особь, ведет себя именно так? =))

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

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