<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>скрипты на все случаи жизни</title>
  <link>http://ru-shell.livejournal.com/</link>
  <description>скрипты на все случаи жизни - LiveJournal.com</description>
  <lastBuildDate>Sat, 09 Jul 2011 00:22:47 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>ru_shell</lj:journal>
  <lj:journalid>10241339</lj:journalid>
  <lj:journaltype>community</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/46061245/10241339</url>
    <title>скрипты на все случаи жизни</title>
    <link>http://ru-shell.livejournal.com/</link>
    <width>99</width>
    <height>99</height>
  </image>

<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/31675.html</guid>
  <pubDate>Sat, 09 Jul 2011 00:22:47 GMT</pubDate>
  <title>mysqldump в несколько гигабайт</title>
  <link>http://ru-shell.livejournal.com/31675.html</link>
  <description>Недавно мне пришлось восстанавливать из бекапа дамп mysql-базы размером в пару гигов. Оставив mysql -p --database xxx &amp;lt; dump.sql на ночь я был чертовски огорчен на следующий день, поскольку &lt;br /&gt;1) восстановление из дампа не было закончено;&lt;br /&gt;2) не было понятно в каком именно месте оно затупило.&lt;br /&gt;Было решено разбить дамп на кучу файлов по одной таблице на файл, а их в свою очередь (если они всё равно получаются слишком большие) разбить на кучу файлов по одному insert на файл (mysqldump, которым делался бекап, пишет ограниченное количество данных на один инсерт).&lt;br /&gt;Погуглив и успешно выполнив эту задачу, на всякий случай опишу используемые инструменты под катом.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Для разбивки одного дампа базы на дампы таблиц можно использовать вот такой скрипт:&lt;br /&gt;&lt;br /&gt;cat dump.sql | awk &apos;BEGIN {&lt;br /&gt;output = &amp;quot;comments&amp;quot;; } $data ~ /^CREATE TABLE/ {&lt;br /&gt; close(output);&lt;br /&gt; output = substr($3,2,length($3)-2); }&lt;br /&gt;{ print $data &amp;gt;&amp;gt; output }&apos;&lt;br /&gt;&lt;br /&gt;На выходе получим по одному файлу на каждую таблицу. Для разбивки такого файла по инсертам можно использовать вот такой скрипт:&lt;br /&gt;awk &apos;/INSERT/{if (n) close(output); output= f n++} n {print &amp;gt;&amp;gt; output }&apos; f=prefix tbl.dump.sql&lt;br /&gt;&lt;br /&gt;Затем я запустил for i in prefix*; do mysql --password=****** --database=mydb &amp;lt; $i; echo &amp;quot;$i done&amp;quot;; done&lt;br /&gt;&lt;br /&gt;Может быть я слишком плохо знаком с консольными утилитами для работы с mysql, может быть есть какой-то более простой способ следить за заливкой дампа в базу?&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;&lt;autoscroll_cursor&gt;&lt;/autoscroll_cursor&gt;&lt;autoscroll_cursor&gt;&lt;/autoscroll_cursor&gt;&lt;autoscroll_cursor&gt;&lt;/autoscroll_cursor&gt;</description>
  <comments>http://ru-shell.livejournal.com/31675.html</comments>
  <category>bash</category>
  <category>mysql</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/31327.html</guid>
  <pubDate>Fri, 11 Mar 2011 22:57:00 GMT</pubDate>
  <title>bash скрипты для ftp</title>
  <link>http://ru-shell.livejournal.com/31327.html</link>
  <description>Встала передо мной задача - нужно было собранные бэкапы заливать на удаленный сервер, попутно удаляя с него лишние бэкапы.&lt;br /&gt;&lt;br /&gt;Возможно кому-нибудь ещё пригодятся эти скрипты, так что далее с небольшими комментариями:&lt;br /&gt;&lt;br /&gt;Первый скрипт находит список подпапок в директории (в моём случае /backup), и из каждой из них копирует последний бєкап на удаленный сервер. При этом на удаленном сервере всё складывается в одну директорию.&lt;br /&gt;&lt;span style=&quot;color: rgb(153, 51, 0);&quot;&gt;#!/bin/sh&lt;br /&gt;for user in `/bin/ls /backup/`&lt;br /&gt;do&lt;br /&gt;/usr/bin/ftp -u ftp://login:password@backup.example.com/last/`/bin/date +%Y-%m-%d`-$user.tar.gz /backup/$user/*-`/bin/date +%Y-%m-%d`.tar.gz&lt;br /&gt;done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Второй - удаляет файлы с фтп. Нет погодите, так было бы слишком просто, второй скрипт будет только листинг директории фтп брать. Кстати, его автор - не я. Он был найден в уже готовом виде:&lt;br /&gt;&lt;span style=&quot;color: rgb(153, 51, 0);&quot;&gt;# cat /root/ftplist.sh&lt;br /&gt;#!/bin/sh&lt;br /&gt;hostname=&amp;quot;ftp://$1:$2@$3/&amp;quot;&lt;br /&gt;ftp $hostname &amp;lt;&amp;lt; EOF&lt;br /&gt;cd last&lt;br /&gt;ls -1R&lt;br /&gt;EOF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Третий - запускает второй скрипт с нужными параметрами, и фильтрует вывод. В результате остаётся только список файлов подлежащих удалению (т.е. все файлы, кроме содержащих сегодняшнюю дату):&lt;br /&gt;&lt;span style=&quot;color: rgb(153, 51, 0);&quot;&gt;# cat /root/ftplistold.sh&lt;br /&gt;#!/bin/sh&lt;br /&gt;/root/ftplist.sh login password backup.example.com | /usr/bin/grep &apos;^-&apos; | /usr/bin/awk &apos;{print $9}&apos; | /usr/bin/grep -v `/bin/date +%Y-%m-%d`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ну и наконец четвертый скрипт - будет у третьего получать список файлов для удаления, и непосредственно удалять на фтп-сервере:&lt;br /&gt;&lt;span style=&quot;color: rgb(153, 51, 0);&quot;&gt;#!/bin/sh&lt;br /&gt;echo open backup.example.com &amp;gt; /tmp/ftpbackuplist&lt;br /&gt;echo user login password &amp;gt;&amp;gt; /tmp/ftpbackuplist&lt;br /&gt;echo cd last &amp;gt;&amp;gt; /tmp/ftpbackuplist&lt;br /&gt;for a in `/root/ftplistold.sh`&lt;br /&gt;do&lt;br /&gt;        echo &amp;quot;delete /last/&amp;quot;$a &amp;gt;&amp;gt; /tmp/ftpbackuplist&lt;br /&gt;done&lt;br /&gt;FTPCMDS=`/bin/cat /tmp/ftpbackuplist`&lt;br /&gt;/bin/rm /tmp/ftpbackuplist&lt;br /&gt;/usr/bin/ftp -inv &amp;lt;&amp;lt; EOF&lt;br /&gt;$FTPCMDS&lt;br /&gt;EOF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вот собственно и всё. Если запускать чистилку до полуночи - а копировалку после, то на резервном сервере будет лежать 2 комплекта бэкапов. Если оба скрипта запускать после полуночи - то только один комплект.&lt;br /&gt;</description>
  <comments>http://ru-shell.livejournal.com/31327.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>vatolkin</lj:poster>
  <lj:posterid>29822316</lj:posterid>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/31013.html</guid>
  <pubDate>Fri, 10 Dec 2010 11:53:32 GMT</pubDate>
  <title>обработчик кнопки вкл/выкл wifi</title>
  <link>http://ru-shell.livejournal.com/31013.html</link>
  <description>столкнулся с задачей подвязать на имеющемся asus eeepc s101h кнопку включения выключения wifi. в первую очередь была цель эргономики - приходя домой с работы и из дома на работу, каждый раз не рестартить wlan0 дабы изменить точку доступа. найденные примеры в интернете мне не особо понравились а некоторые попросту отказывались рабоать, и поэтому вчера вечером решил все-таки сам написать простенький скрипт. он вызывается acpid при появлении события на указанного в default.sh. скрипт полностью логирует все действия. для своей работы использует дополнительный файл, местом хранения которого было выбрано /var/run/&lt;br /&gt;скрипт полностью комментирован, по сему под себя переделать будет элементарно. так же желающие смог легко выкинуть ненужные логи.&lt;br /&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;#скрипт выполняет действия по нажатию кнопки вкл/выкл wifi адаптера, а так же ведет логи в /var/log/wifi.log.&lt;br /&gt;#скрипт использует файл /var/run/wifi.pid&lt;br /&gt;#в /etc/acpi/default.sh нужно указать, что по событию выполняем /etc/init.d/wifi toggle. тоесть данный скрипт, который в /etc/init.d/ и положите, назвав его wifi.&lt;br /&gt;wifi_on() {&lt;br /&gt;/etc/init.d/net.wlan0 start&lt;br /&gt;}&lt;br /&gt;wifi_off() {&lt;br /&gt;/etc/init.d/net.wlan0 stop&lt;br /&gt;}&lt;br /&gt;case $1 in&lt;br /&gt;start)&lt;br /&gt;wifi_on&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;wifi_off&lt;br /&gt;;;&lt;br /&gt;toggle)&lt;br /&gt;sleep 2;&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;;&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;STAT=`cat /var/run/wifi.pid`&lt;br /&gt;#проверяем статус wifi&lt;br /&gt;if [ &amp;quot;$STAT&amp;quot; = &amp;quot;1&amp;quot; ];&lt;br /&gt;#если wifi включен. выключаем его. все сопровождаем логами.&lt;br /&gt;then&lt;br /&gt;{&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi switching_off (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;wifi_off;&lt;br /&gt;echo &amp;quot;0&amp;quot; &amp;gt; /var/run/wifi.pid&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi is off (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;}&lt;br /&gt;#если выключен. проверяем состояние адаптера. если он выключен(состояние не равно 1), говорим что делать так не хорошо. изменений не производим.                                &lt;br /&gt;else&lt;br /&gt;{                                                                                               &lt;br /&gt;sleep 3;                                                                                        &lt;br /&gt;if [ `cat /sys/class/rfkill/rfkill0/state` != &amp;quot;1&amp;quot; ];&lt;br /&gt;then&lt;br /&gt;{&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi hardware is down - wifi is not swinching_on (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi is off (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;}&lt;br /&gt;#а коли адаптер включен, включаем wifi в системе.&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi switching_on (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;wifi_on;&lt;br /&gt;echo &amp;quot;1&amp;quot; &amp;gt; /var/run/wifi.pid&lt;br /&gt;sleep 3;&lt;br /&gt;#проверяем, если при включении wifi в системе, произошел сбой - ругаемся об этом в лог, и пишем в pid что все-таки wifi is off =) если без сбоев - говорим, что все хорошо.&lt;br /&gt;if [ `cat /sys/class/rfkill/rfkill0/state` != &amp;quot;1&amp;quot; ];&lt;br /&gt;then&lt;br /&gt;{&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi switching_on ERROR! please look other logs! (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;echo &amp;quot;0&amp;quot; &amp;gt; /var/run/wifi.pid;&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi is off (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;echo `date +%d/%m/%Y&amp;quot; &amp;quot;%H:%M:%S`&amp;quot; wifi is on (status pid: &amp;quot;`cat /var/run/wifi.pid`&amp;quot;);&amp;quot;&amp;gt;&amp;gt; /var/log/wifi.log;&lt;br /&gt;fi&lt;br /&gt;}&lt;br /&gt;fi                                                                                             &lt;br /&gt;}&lt;br /&gt;fi&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;#сразу оговорюсь - в скрипте допущена возможность такой ситуации, что вы включили адаптер, wifi, но точку он не нашел, и через некоторое время статус адаптера вывалится в &amp;quot;0&amp;quot;, или если адаптер включен, а wifi оказался выключен, и скрипт при последующем запуске будет думать что у нас все плохо, адаптер выключен, а мы нагло пытаемся включить wifi(ибо статус у адаптера будет значится &amp;quot;0&amp;quot;). все не так :) поскольку сей скрипт завязан на кнопку вкл/выкл адаптера, статусы вместе с этим будут меняться на нужные нам, и вышеописанной ситуации у вас не возникнет :) ну или по крайней мере не должно возникнуть :D&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;с радостью приму интересные мысли для поправки/доработки сего мелкого но полезного изделия =)</description>
  <comments>http://ru-shell.livejournal.com/31013.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>9112</lj:poster>
  <lj:posterid>25279745</lj:posterid>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/30741.html</guid>
  <pubDate>Tue, 23 Nov 2010 01:49:18 GMT</pubDate>
  <title>Домашняя система наблюдения</title>
  <link>http://ru-shell.livejournal.com/30741.html</link>
  <description>Через некоторое время я собираюсь уехать из города на несколько дней. Поскольку в моей квартире никого не останется, я решил оставить работающим что-нибудь, что высылало бы мне письма в случае, если в квартиру кто-то зашел. Причем с фотографией того, кто зашел ко мне в дом. Заморачиваться с motion нехотелось, да и освещение у меня тут все в течение дня меняется, так что я написал небольшой bash-скрипт, который решил всю проблему сразу. Итак, нам потребуются: веб-камера, беспроводная мышка и bash.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Беспроводную мышку я привязал нитками к входной двери. Как только дверь откроется, мышка двинется, о чем тут же узнает скрипт и сделает несколько снимков камерой, которые сразу же отправит мне на email.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;#!/bin/bash&lt;br /&gt;pwd=`pwd`&lt;br /&gt;cur=$pwd/cur&lt;br /&gt;mailto=&amp;quot;mymail@domain.tld&amp;quot;&lt;br /&gt;mouse=&amp;quot;/dev/input/mouse1&amp;quot;&lt;br /&gt;camera=&amp;quot;/dev/video0&amp;quot;&lt;br /&gt;cd $pwd&lt;br /&gt;if [ -n $cur ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	touch $cur&lt;br /&gt;fi;&lt;br /&gt;echo 0 &amp;gt; $cur&lt;br /&gt;&lt;br /&gt;getPhoto(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	# пишем с $cur что заняты съемкой&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	echo 1 &amp;gt; $cur&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	moment=`date +%d-%m-%Y-%H.%M`&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	mkdir -p $pwd/$moment&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	# сделаем 10 кадров&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	for i in `seq 10`; do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;		mplayer tv:// -tv driver=v4l2:width=640:height=480:device=$camera -frames 1 -vo png -msglevel all=-1 -quiet&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;		mv $pwd/00000001.png $pwd/$moment/$i.png&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # подождем 10 секунд до следующего кадра&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sleep 10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	done;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in $pwd/$moment/*png; do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;		uuencode $i $i &amp;gt;&amp;gt; $pwd/photos.uuc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	done&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	mail -s &amp;quot;VERY DANGER ALERT&amp;quot; $mailto &amp;lt; photos.uuc	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	rm photos.uuc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	# съемка закончена, пишем в $cur ноль&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	echo 0 &amp;gt; $cur&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;while true;do hexdump -n 1 $mouse &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp; if [ &amp;quot;`cat $cur`&amp;quot; != &amp;quot;1&amp;quot; ];then getPhoto; fi; done&lt;/span&gt;&lt;br /&gt;#EOF&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вроде бы работает. Очень надеюсь, что это никогда не пригодится.&lt;br /&gt;&lt;br /&gt;P.S.Перед вызовом цикла с запуском mplayer наверное неплохо бы запускать какой-нибудь звук из колонок. Какой-нибудь адский крик. Если у вас есть в mp3 что-нибудь подходящее, поделитесь пожалуйста.&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ru-shell.livejournal.com/30741.html</comments>
  <category>bash</category>
  <category>наблюдения</category>
  <category>mplayer</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/30699.html</guid>
  <pubDate>Fri, 15 Oct 2010 08:04:07 GMT</pubDate>
  <link>http://ru-shell.livejournal.com/30699.html</link>
  <description>Нашел свой старый скрипт для поиска больших директорий.&amp;nbsp; Принцип действия предельно прост - есть файл /root/list.txt, в котором находится список директорий, которые скрипт ещё не проанализировал. Каждый раз скрипт читает последнюю строчку файла, получает список вложенных директорий для этого каталога, определяет, не превышает ли&amp;nbsp; самый большой из них предельное значение ALERTSIZE, и в одном случае - дописывает вложенные директории в конец списка /root/list.txt, в другом - отписывается о найденной &amp;quot;REALY&amp;nbsp;BIG&amp;nbsp;DIR&amp;quot; (на экран+пауза 5 сек, и в файл &lt;span&gt;BIGDIRLOG&lt;/span&gt;). При этом размер директории определяется не заходя в неё - как обычного файла.&lt;br /&gt;&lt;br /&gt;Почему не использовать стандартный find для поиска директории?&lt;br /&gt;&lt;span style=&quot;color: rgb(153, 51, 0);&quot;&gt;find / -type d -size +50k &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ответ прост - мы ищем &amp;quot;REALY&amp;nbsp;BIG&amp;nbsp;DIR&amp;quot;, и если find войдет в неё - сервер может банально подвиснуть, либо же очень сильно нагрузить дисковую систему. Кроме этого данный скрипт при перезапуске продолжает свою работу, а не начинает с нуля как find. Ну и конечно-же он в отличии от файнда рисует очень красивый бегущий вверх текст, с директориями в которых только что побывал. Для любителей собирать программы из консоли думаю будет приятно :)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(153, 51, 0);&quot;&gt;#!/bin/sh&lt;br /&gt;LIST=/root/list.txt&lt;br /&gt;LIST2=/root/list2.txt&lt;br /&gt;BIGDIRLOG=/root/bigdir.txt&lt;br /&gt;ALERTSIZE=40000&lt;br /&gt;if [ -z $1 ] &lt;br /&gt;then&lt;br /&gt;else&lt;br /&gt;  echo $1 &amp;gt;&amp;gt; $LIST;&lt;br /&gt;fi&lt;br /&gt;while [ `wc -l $LIST | awk &apos;{print $1}&apos;` != 0 ]&lt;br /&gt;do&lt;br /&gt;  CUR=`tail -n 1 list.txt`&lt;br /&gt;  # список поддиректорий&lt;br /&gt;  PODDIR=`ls -lF $CUR | grep &amp;quot;^d&amp;quot; | awk &apos;{print $9}&apos;`&lt;br /&gt;  # количество поддиректорий&lt;br /&gt;  CPODDIR=`echo $PODDIR | wc -w | awk &apos;{print $1}&apos;`&lt;br /&gt;  # удаляем последнюю строку&lt;br /&gt;  cat $LIST | sed &apos;$d&apos; &amp;gt;&amp;gt; $LIST2 ; mv $LIST2 $LIST&lt;br /&gt;  if [ $CPODDIR -ne 0 ]&lt;br /&gt;  then&lt;br /&gt;    for i in $PODDIR&lt;br /&gt;    do&lt;br /&gt;      echo $CUR$i &amp;gt;&amp;gt; list.txt&lt;br /&gt;    done&lt;br /&gt;    # размер самой большой диры в каталоге&lt;br /&gt;    MOST=`ls -l $CUR | grep &amp;quot;^d&amp;quot; | awk &apos;{print $5 &amp;quot; &amp;quot; $9}&apos; | sort -rn | head -n 1`&lt;br /&gt;    MOSTNAME=`echo $MOST | awk &apos;{print $2}&apos;`&lt;br /&gt;    MOSTSIZE=`echo $MOST | awk &apos;{print $1}&apos;`&lt;br /&gt;    if [ $MOSTSIZE -gt $ALERTSIZE ]&lt;br /&gt;    then&lt;br /&gt;      echo &amp;quot;   * * * REALLY BIG DIR * * *&amp;quot; $CUR$MOSTNAME $MOSTSIZE&lt;br /&gt;      echo $CUR$MOSTNAME $MOSTSIZE &amp;gt;&amp;gt; $BIGDIRLOG&lt;br /&gt;      # удаляем большую диру из списка&lt;br /&gt;      cat $LIST | grep -v $CUR$MOSTNAME &amp;gt;&amp;gt; $LIST2 ; mv $LIST2 $LIST&lt;br /&gt;      sleep 5&lt;br /&gt;    else&lt;br /&gt;      echo $CUR $CPODDIR&lt;br /&gt;    fi&lt;br /&gt;  else&lt;br /&gt;    echo $CUR &amp;quot;&amp;lt;-zero&amp;quot;&lt;br /&gt;  fi&lt;br /&gt; # задержка для снижения загрузки на сервер&lt;br /&gt; # 1 секунда - слишком долго, а меньше пока не получается :(&lt;br /&gt; # sleep 1&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Запускается скрипт тривиально - создаём файл со списком (по умолчанию указан /root/list.txt), и добавляем в него одну или несколько директорий, которые нужно рекурсивно обойти при поиске. После этого скрипт можно запускать без каких-либо параметров :)</description>
  <comments>http://ru-shell.livejournal.com/30699.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>vatolkin</lj:poster>
  <lj:posterid>29822316</lj:posterid>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/30372.html</guid>
  <pubDate>Mon, 07 Jun 2010 20:46:43 GMT</pubDate>
  <link>http://ru-shell.livejournal.com/30372.html</link>
  <description>Есть конфиг&lt;br /&gt;DIR=&quot;/home/user\&lt;br /&gt;    /home/user/.AAA BBB&quot;&lt;br /&gt;как обработать это в цикле чтобы путь не разваливался по пробелам?</description>
  <comments>http://ru-shell.livejournal.com/30372.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>dyff</lj:poster>
  <lj:posterid>3072138</lj:posterid>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/30014.html</guid>
  <pubDate>Fri, 22 Jan 2010 01:00:19 GMT</pubDate>
  <title>Рекурсивный diff</title>
  <link>http://ru-shell.livejournal.com/30014.html</link>
  <description>Чтобы не забыть :) &lt;br /&gt;diff -u -r -B -N -s FOLDER1 FOLDER2</description>
  <comments>http://ru-shell.livejournal.com/30014.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/29780.html</guid>
  <pubDate>Fri, 18 Dec 2009 11:05:49 GMT</pubDate>
  <title>Посчитать самые частые слова</title>
  <link>http://ru-shell.livejournal.com/29780.html</link>
  <description>Возникла задача посчитать слова в большом текстовом файле и сделать по ним топ-листинг. Сами слова разделены пробелами и знаками препинания - короче говоря, обычный текст. &lt;br /&gt;Вывод топ-20 самых популярных русских и английских слов в файле words.txt длинной более 4 символов делается командой&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;cat words.txt| sed s/&quot; &quot;/&quot;\n&quot;/g|sort|sed &apos;s/[[:upper:]]/\l&amp;/g&apos;|sed s/[^a-zа-я-]//g|uniq -c -d| sort -n| awk &apos;length($2) &amp;gt; 4&apos;|tail -n 20| sort -n -r&lt;br /&gt;&lt;br /&gt;Либо, если у вас проблемы между локалью и кодировкой символов, можно сделать вот так:&lt;br /&gt; cat words.txt| sed s/&quot; &quot;/&quot;\n&quot;/g|sort| sed s/&quot;[\,\?\!\.\&quot;\&apos;\:\;]&quot;//g|uniq -c -d| sort -n| awk &apos;length($2) &amp;gt; 4&apos;|tail -n 20| sort -n -r&lt;br /&gt;В этом случае будут исключаться знаки препинания, а не все кроме букв и символа -&lt;br /&gt;&lt;br /&gt;Конечно, можно вместо cat words.txt делать cat folder/*.txt&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ru-shell.livejournal.com/29780.html</comments>
  <category>awk</category>
  <category>bash</category>
  <category>sed</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/29512.html</guid>
  <pubDate>Fri, 11 Dec 2009 16:45:39 GMT</pubDate>
  <title>Парсинг веб-страницы</title>
  <link>http://ru-shell.livejournal.com/29512.html</link>
  <description>Мне понадобилось слить к себе в оффлайн сайт, чтобы в этом самом жутком оффлайне я мог бы его читать. А поскольку читать я люблю со смартфона, нужно было почистить скачанные файлы от всяких html и прочих штуковин. За основу я взял парсер с php.net, немного подправленный за некоторое время использования. &lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;#!/usr/bin/php&lt;br /&gt;&amp;lt;?&lt;br /&gt;&lt;br /&gt;$filename=$argv[1];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$search = array (&amp;quot;&apos;&amp;lt;script[^&amp;gt;]*?&amp;gt;.*?&amp;lt;/script&amp;gt;&apos;si&amp;quot;, &lt;br /&gt;                 &amp;quot;&apos;&amp;lt;[\/\!]*?[^&amp;lt;&amp;gt;]*?&amp;gt;&apos;si&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;([\r\n])[\s]+&apos;&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(quot|#34);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(amp|#38);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(lt|#60);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(gt|#62);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(nbsp|#160);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(iexcl|#161);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(cent|#162);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(pound|#163);&apos;i&amp;quot;,&lt;br /&gt;                 &amp;quot;&apos;&amp;amp;(copy|#169);&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;laquo;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;raquo;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;mdash;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;ndash;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;hellip;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;uuml;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;ldquo;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;rdquo;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;Agrave;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;agrave;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;auml;&apos;i&amp;quot;,&lt;br /&gt;         &amp;quot;&apos;&amp;amp;oacute;&apos;i&amp;quot;&lt;br /&gt;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;$replace = array (&amp;quot;&amp;quot;,&lt;br /&gt;                  &amp;quot;&amp;quot;,&lt;br /&gt;                  &amp;quot;\\1&amp;quot;,&lt;br /&gt;                  &amp;quot;\&amp;quot;&amp;quot;,&lt;br /&gt;                  &amp;quot;&amp;amp;&amp;quot;,&lt;br /&gt;                  &amp;quot;&amp;lt;&amp;quot;,&lt;br /&gt;                  &amp;quot;&amp;gt;&amp;quot;,&lt;br /&gt;                  &amp;quot; &amp;quot;,&lt;br /&gt;                  chr(161),&lt;br /&gt;                  chr(162),&lt;br /&gt;                  chr(163),&lt;br /&gt;                  chr(169),&lt;br /&gt;          &amp;quot;\&amp;quot;&amp;quot;,&lt;br /&gt;          &amp;quot;\&amp;quot;&amp;quot;,&lt;br /&gt;          &amp;quot;-&amp;quot;,&lt;br /&gt;          &amp;quot;-&amp;quot;,&lt;br /&gt;          &amp;quot;...&amp;quot;,&lt;br /&gt;          &amp;quot;u&amp;quot;,&lt;br /&gt;         &amp;quot;\&amp;quot;&amp;quot;,&lt;br /&gt;         &amp;quot;\&amp;quot;&amp;quot;,&lt;br /&gt;         &amp;quot;A&amp;quot;,&lt;br /&gt;         &amp;quot;a&amp;quot;,&lt;br /&gt;         &amp;quot;a&amp;quot;,&lt;br /&gt;         &amp;quot;о&amp;quot;&lt;br /&gt;); &lt;br /&gt;&lt;br /&gt;$handle = fopen($filename, &amp;quot;r&amp;quot;);&lt;br /&gt;$contents = fread($handle, filesize($filename));&lt;br /&gt;echo preg_replace($search, $replace, $contents);&lt;br /&gt;fclose($handle);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Этот код можно сохранить в файле /usr/sbin/htmlparse.php. Не забудьте сделать ему chmod +x&lt;br /&gt;&lt;br /&gt;Теперь как этим пользоваться.&lt;br /&gt;Предположим, скачали сайт командой wget -r  &lt;a href=&apos;http://domain.ru&apos; rel=&apos;nofollow&apos;&gt;http://domain.ru&lt;/a&gt;&lt;br /&gt;После скачивания всех файлов делаем следующее:&lt;br /&gt;find domain.ru/ -type d -exec sh -c &amp;quot;mkdir -p parsed/&apos;{}&apos;&amp;quot; \;&lt;br /&gt;find domain.ru/ -type f -exec sh -c &amp;quot;htmlparse.php &apos;{}&apos;&amp;gt; parsed/&apos;{}&apos;&amp;quot; \;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ну вот, все лежит в директории parsed и теперь это можно читать без всякой лишней фигни. Пока все, может еще чего допишу позже.&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ru-shell.livejournal.com/29512.html</comments>
  <category>find</category>
  <category>parse</category>
  <category>php</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/29266.html</guid>
  <pubDate>Fri, 11 Dec 2009 15:56:37 GMT</pubDate>
  <title>Рекурсивная смена кодировки</title>
  <link>http://ru-shell.livejournal.com/29266.html</link>
  <description>Пишу сюда просто примера ради.&lt;br /&gt;find . -type f -exec sh -c &quot;cat &apos;{}&apos; | iconv -f cp1251 -t utf8 -o &apos;{}&apos;&quot; \;&lt;br /&gt;&lt;br /&gt;Эта строка рекурсивно сменит кодировку во всех файлах в текущей директории с виндовой на utf8.</description>
  <comments>http://ru-shell.livejournal.com/29266.html</comments>
  <category>iconv</category>
  <category>bash</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/18599.html</guid>
  <pubDate>Sat, 31 Oct 2009 18:49:22 GMT</pubDate>
  <title>Мониторинг hdd</title>
  <link>http://ru-shell.livejournal.com/18599.html</link>
  <description>&amp;nbsp;Захотелось красивого мониторинга за температурой и нагрузкой hdd на домашнем хосте. Короче говоря, кое-как получилось. Для работы нам потребуются&amp;nbsp;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;a name=&quot;cutid2&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;a href=&quot;http://www.guzu.net/linux/hddtemp.php&quot; rel=&quot;nofollow&quot;&gt;hddtemp&lt;/a&gt;, &lt;a href=&quot;http://guichaz.free.fr/iotop/&quot; rel=&quot;nofollow&quot;&gt;iotop&lt;/a&gt;, &lt;a href=&quot;http://www.galago-project.org&quot; rel=&quot;nofollow&quot;&gt;libnotify&lt;/a&gt;&lt;div&gt;&amp;nbsp;&lt;div&gt;Вот сам bash-скрипт:&lt;div&gt;&amp;nbsp;&lt;div&gt;#!/bin/bash&lt;div&gt;panic=false;&lt;div&gt;# Здесь пишем максимальную температуру.&lt;div&gt;term=64;&lt;br /&gt;&lt;div&gt;# Подключим виртульную ФС, заняв немного ram. Туда будут складываться логи.&lt;div&gt;tmpfs=/var/log/tmpfs;&lt;br /&gt;tmpfsize=512;&lt;br /&gt;&lt;div&gt;mkdir -p ${tmpfs};&lt;/div&gt;&lt;div&gt;if [ &amp;quot;`mount|grep ${tmpfs}`&amp;quot; = &apos;&apos; ]; then&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mount none ${tmpfs} -t tmpfs -o nr_inodes=2,size=${tmpfsize}K&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;touch ${tmpfs}/hdd.log;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;fi&lt;/div&gt;&lt;div&gt;#Здесь мы определяем кто последний залогинился в иксы, ему скрипт и будет высылать уведомления.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(153, 153, 153); &quot;&gt;#display=`w|grep xdm| awk {&apos;print $2&apos;}|tail -n 1`;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(153, 153, 153); &quot;&gt;#user=`w|grep xdm|awk {&apos;print $1&apos;}|tail -n 1`;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;display=:`ls -1 /tmp/.X11-unix/| sed s/X//| tail -n 1`;&lt;/div&gt;&lt;div&gt;user=`w| grep &amp;quot;${display} &amp;quot;|awk {&apos;print $1&apos;}`;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;export DISPLAY=${display};&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;#Если никто не залогинен, выходим. Вообще, можно и не выходить, а высылать алерты на емейл. Но зачем повторять функционал nagios :)&lt;/div&gt;&lt;div&gt;if [ $user = &apos;&apos; ]; then exit 0; fi&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;# если в ${tmpfs} кончилось место, делаем все что можем чтобы донести это до тебя&lt;/div&gt;&lt;div&gt;if [ &amp;quot;`du ${tmpfs}/hdd.log|awk {&apos;print $1&apos;}`&amp;quot; = ${tmpfsize} ]; then&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nospace=true;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in=0;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while [ ${in} != &amp;quot;10&amp;quot; ]; do&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;su ${user} -c &amp;quot;notify-send -u &amp;nbsp;critical &apos;В ${tmpfs} кончилось место. Возможно, это случилось по причине сильного перегрева одного из дисков. Пора что-то делать!!! Можешь почистить логи, но разобраться с хардом придется!&apos;&amp;quot;;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in=`expr ${in} + 1`;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sleep 10;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;done&lt;/div&gt;&lt;div&gt;else&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nospace=false;&lt;/div&gt;&lt;div&gt;fi&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;# три моих диска - sda, sdb и sdc&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for drive in sda sdb sdc; do&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(153, 153, 153); &quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;temp=`hddtemp /dev/sd${drive}| awk {&apos;print $3&apos;}| sed s/&amp;quot;&amp;deg;C&amp;quot;//`;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;temp=`hddtemp -n /dev/${drive}`;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if [ ${temp} -ge ${term} ]; then&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;su ${user} -c &amp;quot;notify-send -u critical &apos;ВНИМАНИЕ! Температура жесткого диска /dev/${drive} поднялась до $temp&amp;deg;C&apos;&amp;quot;;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if [ &amp;quot;${nospace}&amp;quot; = &apos;false&apos; ]; then&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo &amp;quot;$temp&amp;deg;C on /dev/$drive at `date +%d.%m.%Y-%H:%M`&amp;quot; &amp;gt;&amp;gt; ${tmpfs}/hdd.log&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fi&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panic=true;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fi&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;done&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;if [ &amp;quot;${panic}&amp;quot; = &apos;true&apos; ]; then&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(153, 153, 153); &quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;su ${user} -c &amp;quot;notify-send -u critical &apos;Вот три топовых процесса:&amp;nbsp;`iotop -b -n 1 &amp;gt; /tmp/iotop &amp;amp;&amp;amp; echo &amp;amp;&amp;amp; head -n 5 /tmp/iotop| tail -n 3| awk {&apos;print $11&amp;quot; (pid:&amp;quot;$1&amp;quot;)&amp;quot;&apos;} &amp;amp;&amp;amp; rm -f /tmp/iotop`&apos;&amp;quot;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;su ${user} -c &amp;quot;notify-send -u critical &apos;Вот три топовых процесса: `iotop -b -n 1 2&amp;gt;/dev/null|head -n 5| tail -n 3| awk {&apos;print $11&amp;quot; (pid:&amp;quot;$1&amp;quot;)&amp;quot;&apos;}`&apos;&amp;quot;;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;fi&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Поставил выполняться кроном от имени root раз в пять минут. Результат можете увидеть на скриншоте.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;a name=&apos;cutid2-end&apos;&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://pics.livejournal.com/grohman/pic/00019pz9/&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://pics.livejournal.com/grohman/pic/00019pz9/s320x240&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a name=&quot;cutid3&quot;&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;div&gt;Кончено, вместо libnotify можно использовать mail, это всё довольно просто. Однако,&lt;/div&gt;&lt;a name=&apos;cutid3-end&apos;&gt;&lt;/a&gt;&lt;strike&gt;мне не очень понятно как бы выдергивать строки из iotop без использования файлов. Пробовал по-всякому, фигня получается. Помогите, пожалуйста, с ним разобраться&lt;/strike&gt;.&lt;br /&gt;update: вроде все сделано :) Спасибо 1_ananas_1 за участие.&lt;br /&gt;update1: теперь захотелось вести логи. Но поскольку писать логи про хдд на хдд мне показалось не очень уместным, я решил писать их в оперативную память. А точнее, в tmpfs. Храниться они там будут, само собой, только до размонтирования ${tmpfs}.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
  <comments>http://ru-shell.livejournal.com/18599.html</comments>
  <category>bash</category>
  <category>x11</category>
  <category>hdd</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/13189.html</guid>
  <pubDate>Wed, 09 Sep 2009 11:37:51 GMT</pubDate>
  <title>Поиск совпадений в тексте</title>
  <link>http://ru-shell.livejournal.com/13189.html</link>
  <description>Есть текстовый файл - электронная книга.&lt;br /&gt;Есть желание по ключевым словам найти в ней соответствующий параграф, а, найдя, ознакомиться по-подробней с контекстом.&lt;br /&gt;&lt;br /&gt;=======script.sh========================&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;#&lt;br /&gt;## usage: script.sh book_file key_word1 [key_word2 key_word3 ...]&lt;br /&gt;&lt;br /&gt;awk &apos;/&apos;$2&apos;/&amp;&amp;/&apos;$3&apos;/&amp;&amp;/&apos;$4&apos;/&amp;&amp;/&apos;$5&apos;/&amp;&amp;/&apos;$6&apos;/&amp;&amp;/&apos;$7&apos;/ {print NR &quot;|&quot; $0}&apos; $1 | pager&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Найденные параграфы, содержащие искомые слова пронумерованы.&lt;br /&gt;# Когда мы нашли что-то заинтересовавшее нас, мы можем, выйдя из pager&apos;а &lt;br /&gt;# ввести номер этой строки, на что получим фрагмент из исходной книги,&lt;br /&gt;# начинающийся пятью строками раньше найденной строки, а заканчивающийся&lt;br /&gt;# пятью строками после найденной строки&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;echo -----------------------&lt;br /&gt;echo Какой вариант раскрыть подробней?; read NUM&lt;br /&gt;cat $1 | sed -n &apos;&apos;$(($NUM-5))&apos;,&apos;$(($NUM+5))&apos;p&apos; | pager&lt;br /&gt;&lt;br /&gt;==============================================&lt;br /&gt;&lt;br /&gt;а какие еще есть способы сделать то же самое?</description>
  <comments>http://ru-shell.livejournal.com/13189.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>am_kalinin</lj:poster>
  <lj:posterid>20624299</lj:posterid>
  <lj:reply-count>11</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/12909.html</guid>
  <pubDate>Mon, 23 Mar 2009 11:36:02 GMT</pubDate>
  <title>Сверяем хостнеймы с днс-записями</title>
  <link>http://ru-shell.livejournal.com/12909.html</link>
  <description>В моей сети все получают ip по dhcp, а виндовые хостнеймы должны соответствовать записям в dns (в моем случае это фамилия юзера транслитом). К несчастью, иногда не все хосты соответствую этому стандарту. Для нахождения таких хостов я использую вот этот скрипт, запуская кроном раз в пять минут.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;#!/bin/bash&lt;br /&gt;letter=&amp;quot;/tmp/ns-mismatch.txt&amp;quot;;&lt;br /&gt;admin=&amp;quot;admin@domain.tld&amp;quot;;&lt;br /&gt;copy=&amp;quot;-c anykey@domain.tld&amp;quot;;&lt;br /&gt;exclude=&amp;quot;grep -v 192.168.4.10&amp;quot;&lt;br /&gt;&lt;br /&gt;sendto=&amp;quot;${admin} ${copy}&amp;quot;;&lt;br /&gt;&lt;br /&gt;touch ${letter};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for ip in `tail -n 30 /var/log/dhcpd.log | grep -i dhcpack| ${exclude}| awk {&apos;print $8&apos;}`; do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dns=`nslookup ${ip}| awk {&apos;print $4&apos;}| sed /^$/d| awk -F. {&apos;print $1&apos;}`;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hostname=`nmblookup -A ${ip}| grep 00|awk {&apos;print $1&apos;}| head -n 1| tr [:upper:] [:lower:]`;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if [ &amp;quot;${dns}&amp;quot; != &amp;quot;${hostname}&amp;quot; ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; emailtext=&amp;quot;Hostname ${hostname} does not match dns-record ${dns}.domain.tld for ${ip}&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo ${emailtext} &amp;gt;&amp;gt; ${letter};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;if [ &amp;quot;`cat ${letter}`&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mail -s &amp;quot;Hostname mismatch&amp;quot; ${sendto} &amp;lt; ${letter};&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;rm -f ${letter};&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;&lt;br /&gt;</description>
  <comments>http://ru-shell.livejournal.com/12909.html</comments>
  <category>bash dns</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/12685.html</guid>
  <pubDate>Wed, 25 Feb 2009 11:08:23 GMT</pubDate>
  <title>At</title>
  <link>http://ru-shell.livejournal.com/12685.html</link>
  <description>Кто-нибудь знает, очереди в аргументе команды at являются независимыми?&lt;br /&gt;&lt;br /&gt;То есть реально ли добавить в очередь K пять команд, чтобы они выполнялись последовательно, и в очередь N так же 5 команд, чтобы две очереди работали независимо друг от друга?</description>
  <comments>http://ru-shell.livejournal.com/12685.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>solovieff13</lj:poster>
  <lj:posterid>7130871</lj:posterid>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/12235.html</guid>
  <pubDate>Sat, 08 Nov 2008 12:54:42 GMT</pubDate>
  <title>передергиваем клиент DHCP, если нет пинга</title>
  <link>http://ru-shell.livejournal.com/12235.html</link>
  <description>Привет.&lt;br /&gt;Есть такой полезняк:&lt;br /&gt;&lt;br /&gt;/sbin/ping -q -c4 -i0.01 -W1 | /usr/bin/grep &quot;100.0%&quot;|| echo &quot;inet down &quot;`date +%Y-%m-%d-%H-%M-%S` &amp;gt;&amp;gt;/var/log/inetdown.log&lt;br /&gt;&lt;br /&gt;(пингует днс провайдера и если нет коннекта, то выводит ругню в лог)&lt;br /&gt;&lt;br /&gt;Нужно развить мысль, а именно - чтобы кроме писАния в лог еще выполнялось&lt;br /&gt;&lt;br /&gt;# killall dhcpcd&lt;br /&gt;и&lt;br /&gt;# dhcpcd eth1&lt;br /&gt;но! только если нет пинга.&lt;br /&gt;&lt;br /&gt;Подскажите, а то я новичок и пока что совсем не чувствую вопроса.&lt;br /&gt;Спасибо.</description>
  <comments>http://ru-shell.livejournal.com/12235.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>marchello</lj:poster>
  <lj:posterid>11579453</lj:posterid>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/11954.html</guid>
  <pubDate>Mon, 01 Sep 2008 14:24:44 GMT</pubDate>
  <title>Passing arguments by pipe</title>
  <link>http://ru-shell.livejournal.com/11954.html</link>
  <description>Извините, пожалуйста. &lt;br /&gt;&lt;br /&gt;Похоже я рискую прославится тем что задаю тут какие-то странно-глупые вопросы.&lt;br /&gt;Но... в общем у меня опять странно глупый вопрос, на который я не найду ответа.&lt;br /&gt;&lt;br /&gt;Пишем меленький скрипт, который просто печатает количество переданных ему аргументов&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;temp.ksh:&lt;br /&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;&lt;br /&gt;echo &quot;$#&quot;&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Смотрим&lt;br /&gt;&lt;i&gt;]$ ./temp.ksh&lt;br /&gt;0&lt;br /&gt;]$ ./temp.ksh 3&lt;br /&gt;1&lt;br /&gt;]$ ./temp.ksh 3 | ./temp.ksh&lt;br /&gt;0&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Хм...&lt;br /&gt;И даже если вот так:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;]$ echo 3&lt;br /&gt;3&lt;br /&gt;]$ echo 3 | ./temp.ksh&lt;br /&gt;0&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Хм....&lt;br /&gt;После некоторых размышлений появилась мысль, что может быть даже это и логично (типа каждый скрипт запускает свой новый шелл и т.п.).&lt;br /&gt;Но все равно остались вопросы:&lt;br /&gt;А логично ли все-таки?&lt;br /&gt;Все-таки как же это сделать-то тогда?&lt;br /&gt;&lt;br /&gt;//В последним вопросе под &quot;это&quot; имелось в виду, конечно не вариант в примере, а нечто более общее. Есть некий скрипт, который производит некий оутпут, и хотелось этот оутпут через пайп переправить второму скрипту.&lt;br /&gt;Оно конечно можно было бы это все сделать и по-другому, ну, к примеру, через какой-нибудь темпорари файл... но а вот через пайп, что? Никак нельзя?&lt;br /&gt;&lt;br /&gt;Заранее спасибо, и извините если вопрос, как всегда, слишком ламерский.&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ru-shell.livejournal.com/11954.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>paul_z</lj:poster>
  <lj:posterid>5263013</lj:posterid>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/11536.html</guid>
  <pubDate>Tue, 26 Aug 2008 22:12:41 GMT</pubDate>
  <title>MyICQbot</title>
  <link>http://ru-shell.livejournal.com/11536.html</link>
  <description>У всех ли есть внешний ip-адрес? Все ли могут, сидя на работе/в университете/где угодно скачивать на свой домашний ПК какие-либо файлы? Предположим, вам известен url фильма который вы хотели бы вечером посмотреть у себя дома.  Но кому бы захотелось придя домой его скачивать, а не сразу смотреть? :)&lt;br /&gt;Подобных примеров можно придумать очень много.  Особенно, если нету внешнего ip-адреса (привет пользователям стрима;-) ).&lt;br /&gt;Дабы решить эту вселенскую несправедливость, было решено написать &lt;b&gt;icq-бот&lt;/b&gt;а, который мог бы скачивать файлы на тот хост, на котором запущен. В качестве языка написания был выбран perl, потому как 1) для него уже существует Net::OSCAR. &lt;br /&gt;2) За основу нашего бота был взят бот &lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://security-teams.net/&quot; rel=&quot;nofollow&quot;&gt;drmist&lt;/a&gt;&apos;а написанный на perl %)&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;a name=&quot;cutid2&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;a name=&quot;cutid3&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;Прежде всего нужен работающий Net::OSCAR, которого у вас скорее всего нет. Ставится просто, через cpan.&lt;br /&gt;# cpan&lt;br /&gt;cpan &amp;gt; install Net::OSCAR&lt;br /&gt;&lt;br /&gt;Бот понимает команды &lt;br /&gt;!get url&lt;br /&gt;!status filename&lt;br /&gt;&lt;br /&gt;url может быть http или ftp. Или ещё что угодно, с чем умеет работать wget.&amp;nbsp; &lt;br /&gt;Ну и ещё, конечно, нужно зарегистрировать уин для бота на icq.com %)&lt;br /&gt;Очень интересные вещи описаны в man Net::OSCAR&lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;$mypath = &quot;~/MyICQDownloads&quot;;&lt;br /&gt;&lt;br /&gt;use IO::Socket::INET;&lt;br /&gt;use Net::OSCAR;&lt;br /&gt;use Net::DNS;&lt;br /&gt;use Text::Iconv;&lt;br /&gt;&lt;br /&gt;%functions = (&quot;get&quot; =&amp;gt; \&amp;amp;icq_bot_get,&lt;br /&gt;             &quot;status&quot; =&amp;gt; \&amp;amp;icq_bot_status);&lt;br /&gt;&lt;br /&gt;$conv = Text::Iconv-&amp;gt;new(&apos;utf-8&apos;,&apos;windows-1251&apos;);&lt;br /&gt;$resolver = Net::DNS::Resolver-&amp;gt;new();&lt;br /&gt;$oscar = Net::OSCAR-&amp;gt;new();&lt;br /&gt;$oscar-&amp;gt;set_callback_im_in(\&amp;amp;message_callback);&lt;br /&gt;$oscar-&amp;gt;signon(999999999, &quot;MyPass1&quot;) or die(&quot;Login failed\n&quot;);&lt;br /&gt;$quit = 0;&lt;br /&gt;while(!$quit) { $oscar-&amp;gt;do_one_loop(); }&lt;br /&gt;sub message_callback {&lt;br /&gt; local($cmd, $params, $result);&lt;br /&gt; local $result = &quot;&quot;;&lt;br /&gt; local($client, $uin, $msg) = @_;&lt;br /&gt; if(($cmd, $params) = $msg =~ /^\!([^\ ]+) (.+)$/)&lt;br /&gt; {&lt;br /&gt;   $result = exists($functions{$cmd}) ? $functions{$cmd}($params) : &quot;&quot;;&lt;br /&gt;   $client-&amp;gt;send_im($uin, $result) if $result;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub icq_bot_get {&lt;br /&gt;$url = $_[0];&lt;br /&gt;local $get = &quot;/usr/bin/wget -b -P $mypath $url&quot;;&lt;br /&gt;@url=split /(.*\/)/, $url;&lt;br /&gt;local $prog = system &quot;$get -o $mypath/@url[2].log 1&amp;gt;&amp;amp;2 &amp;gt; /dev/null&quot;;&lt;br /&gt;return &quot;$url &amp;gt;&amp;gt;&amp;gt; downloading to $mypath\n Use \&quot;!status @url[2]\&quot; without quotes for last logs&quot;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub icq_bot_status {&lt;br /&gt;local $file = $_[0];&lt;br /&gt;$log = `tail -n 2 $mypath/$file.log`;&lt;br /&gt;return $log;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что возможностей модернизации здесь крайне много. &lt;br /&gt;Но всех мыслей в голове не удержишь (ну да, я тоже подумал об icq2ssh, наверное было бы забавно), хочется узнать ваше мнение и предложения по улучшению бота. Предложения с примерами кода категорически приветствуются.</description>
  <comments>http://ru-shell.livejournal.com/11536.html</comments>
  <category>perl wget icq</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/11288.html</guid>
  <pubDate>Tue, 26 Aug 2008 20:52:22 GMT</pubDate>
  <title>splitfd - автоматическая раскидка большого количества фаилов по каталогам</title>
  <link>http://ru-shell.livejournal.com/11288.html</link>
  <description>у вас было когда ни будь желание разделить несколько тысяч разно-именованых фаилов, в директории. скажем по 100 или 200 фаилов в каждой?&lt;br /&gt;&lt;br /&gt;Так вот:&lt;br /&gt;&lt;br /&gt;$ splitfd -s /home/user/10000_files -t /home/user/temp -p new_ -n 200&lt;br /&gt;&lt;br /&gt;сделает примерно 50 директорий (new_01, new_02, ...) в /home/user/temp,&amp;nbsp; в которых будут лежать те 10000 фаилов из каталога /home/user/10000_files&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.freewebs.com/rozouvan/scripts/splitfd&quot; rel=&quot;nofollow&quot;&gt;splitfd&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS: как обычно, я не проверил если уже есть утилита которая именно это может делать ;)</description>
  <comments>http://ru-shell.livejournal.com/11288.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>v_rozouvan</lj:poster>
  <lj:posterid>8264000</lj:posterid>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/11116.html</guid>
  <pubDate>Wed, 20 Aug 2008 19:35:51 GMT</pubDate>
  <title>apt_search</title>
  <link>http://ru-shell.livejournal.com/11116.html</link>
  <description>&lt;span&gt;Мой&lt;/span&gt; &lt;span&gt;скрипт&lt;/span&gt; &lt;span&gt;для&lt;/span&gt; &lt;span&gt;поиска&lt;/span&gt; &lt;span&gt;Debian&lt;/span&gt; &lt;span&gt;пакетов&lt;/span&gt;. &lt;span&gt;Быстрый&lt;/span&gt;, &lt;span&gt;верный&lt;/span&gt;, &lt;span&gt;и&lt;/span&gt; &lt;span&gt;удобный&lt;/span&gt; ;)&lt;br /&gt;&lt;span&gt;Что&lt;/span&gt; &lt;span&gt;бы&lt;/span&gt; &lt;span&gt;заработал&lt;/span&gt;, &lt;span&gt;сначало&lt;/span&gt; &lt;span&gt;запустите&lt;/span&gt; &lt;span&gt;apt&lt;/span&gt;_&lt;span&gt;search&lt;/span&gt;_&lt;span&gt;update&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;http://www.freewebs.com/rozouvan/scripts/apt%5Fsearch&lt;br /&gt;http://www.freewebs.com/rozouvan/scripts/apt%5Fsearch%5Fupdate&lt;br /&gt;&lt;br /&gt;Отсюда:&lt;br /&gt;http://v-rozouvan.livejournal.com/2008/08/19/</description>
  <comments>http://ru-shell.livejournal.com/11116.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>v_rozouvan</lj:poster>
  <lj:posterid>8264000</lj:posterid>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/10791.html</guid>
  <pubDate>Wed, 30 Jul 2008 22:11:59 GMT</pubDate>
  <title>Подскажите кто знает</title>
  <link>http://ru-shell.livejournal.com/10791.html</link>
  <description>Может быть задаю странный вопрос но всё же, можно ли в Xcode 3.1 писать bash скрипты и прикручивать к ним gui и потом собирать это дело как standalone приложение?</description>
  <comments>http://ru-shell.livejournal.com/10791.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>djakov</lj:poster>
  <lj:posterid>13847313</lj:posterid>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/10583.html</guid>
  <pubDate>Fri, 25 Jul 2008 05:35:35 GMT</pubDate>
  <link>http://ru-shell.livejournal.com/10583.html</link>
  <description>Написал простенький скрипт для завершения программы через определенное количество минут. &lt;br /&gt;Написан на perl&apos;e&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Пример использования: killprg.sh +10 xmms &lt;br /&gt;т.е. через десять минут этот скрипт завершит xmms. Кстати регистронезависимый скрипт.&lt;br /&gt;Пы. сы. в программировании не очень силен, так что сильно не пинайте :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;# powered by mentax&lt;br /&gt;$|=1;&lt;br /&gt;&lt;br /&gt;sub usage{&lt;br /&gt;    print &quot;\nUsage: killprg [program]\n&quot;;&lt;br /&gt;    print &quot;       killprg +[minutes to kill] [program]\n\n&quot;;&lt;br /&gt;    exit;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$time=@ARGV[0];&lt;br /&gt;if($time=~s/\+//){&lt;br /&gt;    $time+=0;&lt;br /&gt;    $prg=@ARGV[1];&lt;br /&gt;}else{&lt;br /&gt;    $prg=@ARGV[0];&lt;br /&gt;    $time=0;&lt;br /&gt;}&lt;br /&gt;$seconds=$time*60;&lt;br /&gt;&lt;br /&gt;usage if($prg eq &quot;&quot;);&lt;br /&gt;print&quot;Start at: &quot;.localtime(time).&quot;\n&quot;;&lt;br /&gt;print&quot;kill after $time minuts. Search: \&quot;$prg\&quot;\n&quot;;&lt;br /&gt;$started=time;&lt;br /&gt;&lt;br /&gt;for(;;){&lt;br /&gt;    if($started+$seconds&lt;div class=&apos;ljparseerror&apos;&gt;[&lt;b&gt;Error:&lt;/b&gt; Irreparable invalid markup (&apos;&amp;lt;time){&amp;gt;&apos;) in entry.  Owner must fix manually.  Raw contents below.]&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 95%; overflow: auto&quot;&gt;Написал простенький скрипт для завершения программы через определенное количество минут. &lt;br /&gt;Написан на perl&amp;#39;e&lt;br /&gt;&amp;lt;lj-cut text=&amp;quot;Читать дальше&amp;quot;&amp;gt;&lt;br /&gt;Пример использования: killprg.sh +10 xmms &lt;br /&gt;т.е. через десять минут этот скрипт завершит xmms. Кстати регистронезависимый скрипт.&lt;br /&gt;Пы. сы. в программировании не очень силен, так что сильно не пинайте :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;# powered by mentax&lt;br /&gt;$|=1;&lt;br /&gt;&lt;br /&gt;sub usage{&lt;br /&gt;    print &amp;quot;\nUsage: killprg [program]\n&amp;quot;;&lt;br /&gt;    print &amp;quot;       killprg +[minutes to kill] [program]\n\n&amp;quot;;&lt;br /&gt;    exit;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$time=@ARGV[0];&lt;br /&gt;if($time=~s/\+//){&lt;br /&gt;    $time+=0;&lt;br /&gt;    $prg=@ARGV[1];&lt;br /&gt;}else{&lt;br /&gt;    $prg=@ARGV[0];&lt;br /&gt;    $time=0;&lt;br /&gt;}&lt;br /&gt;$seconds=$time*60;&lt;br /&gt;&lt;br /&gt;usage if($prg eq &amp;quot;&amp;quot;);&lt;br /&gt;print&amp;quot;Start at: &amp;quot;.localtime(time).&amp;quot;\n&amp;quot;;&lt;br /&gt;print&amp;quot;kill after $time minuts. Search: \&amp;quot;$prg\&amp;quot;\n&amp;quot;;&lt;br /&gt;$started=time;&lt;br /&gt;&lt;br /&gt;for(;;){&lt;br /&gt;    if($started+$seconds&amp;lt;time){&lt;br /&gt;        @lines=split(/\n/,`ps aux`);&lt;br /&gt;        shift @lines;&lt;br /&gt;        for$line(@lines){&lt;br /&gt;            @columns=split(/[\t\s]+/,$line);&lt;br /&gt;            unless($line=~/killprg/){&lt;br /&gt;                if($line=~/$prg/i){&lt;br /&gt;                    $cmd=join(&amp;quot; &amp;quot;,@columns[10..50]);&lt;br /&gt;                    print &amp;quot;Found and kill process: @columns[1] -&amp;gt; $cmd\n&amp;quot;;&lt;br /&gt;                    `kill @columns[1]`;&lt;br /&gt;                    exit;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        print &amp;quot;+&amp;quot;;&lt;br /&gt;    }else{&lt;br /&gt;        print &amp;quot;.&amp;quot;;&lt;br /&gt;    }&lt;br /&gt;    sleep 1;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/lj-cut&amp;gt;&lt;/div&gt;&lt;/div&gt;</description>
  <comments>http://ru-shell.livejournal.com/10583.html</comments>
  <category>perl</category>
  <lj:music>Кукрыниксы - Никто</lj:music>
  <media:title type="plain">Кукрыниксы - Никто</media:title>
  <lj:mood>Рабочее</lj:mood>
  <lj:security>public</lj:security>
  <lj:poster>mentax</lj:poster>
  <lj:posterid>12863566</lj:posterid>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/10284.html</guid>
  <pubDate>Tue, 22 Jul 2008 12:59:01 GMT</pubDate>
  <title>SSH</title>
  <link>http://ru-shell.livejournal.com/10284.html</link>
  <description>Друзья подскажите как можно по ssh соединиться с удалённым сервером, так чтобы в одной команде был и логин и пароль. Если просто логин то надо так ssh username@ip.add.re.ss? А как пароль добавить. Спасибо.</description>
  <comments>http://ru-shell.livejournal.com/10284.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>djakov</lj:poster>
  <lj:posterid>13847313</lj:posterid>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/10049.html</guid>
  <pubDate>Thu, 17 Jul 2008 14:26:09 GMT</pubDate>
  <title>Проблема с cut в ksh</title>
  <link>http://ru-shell.livejournal.com/10049.html</link>
  <description>Извините, пожалуйста, может и глупость спрашиваю, но что-то я в такой растерянности прибываю.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Система Fedora:&lt;br /&gt;$more /etc/redhat-release&lt;br /&gt;Fedora release 7 (Moonshine)&lt;br /&gt;&lt;br /&gt;Есть два скриптика, test_ksh.ksh и test_csh.csh.&lt;br /&gt;Разница только в первой линии (естественно), соответственно: #!/bin/ksh и #!/bin/csh &lt;br /&gt;&lt;br /&gt;Дальше все одинаково:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;head -1 res_121_1_bl.txt | cut -d&quot;;&quot; -f10-14&lt;br /&gt;head -1 res_121_1_bl.txt | cut -d&quot;;&quot; -f10,14&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;res_121_1_bl.txt - просто некий текстовый файлик, в котором через точку с запятой в колонках находятся всякие цифирки. Хочу посмотреть названия колонок. В первой линии названия колонок с 10 по 14. Во второй только 10 и 14.&lt;br /&gt;&lt;br /&gt;Вот результаты:&lt;i&gt;&lt;br /&gt;$./test_csh.csh&lt;br /&gt;ns_lixiv;ns_no3_sol_fin;ns_nh4_sol_fin;ns_volat_engr;ns_denit&lt;br /&gt;ns_lixiv;&lt;font color=&quot;Red&quot;&gt;ns_denit&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;$./test_ksh.ksh&lt;br /&gt;ns_no3_sol_fin;ns_nh4_sol_fin;ns_volat_engr;ns_denit&lt;br /&gt;ns_lixiv;&lt;font color=&quot;Red&quot;&gt;ns_nh4_sol_fin&lt;/font&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Даже не знаю, что и делать.&lt;br /&gt;Ну.. на всякий случай еще немного информации:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;$ /bin/ksh          &lt;br /&gt;$ print ${.sh.version}&lt;br /&gt;Version M 1993-12-28 s&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ну и... запустил те же самые скрипты, на Solaris-е, которым рулят умные админы. Там все работает нормально, вторая строка для обоих шеллов выдает 10 и 14 колонки.&lt;br /&gt;Правда не нашел как посмотреть в solaris-овском ksh его версию.&lt;br /&gt;&lt;br /&gt;Подскажите в чем может быть дело? Бага ksh? Бага Fedora? Бага Fedora, которая установила кривой ksh?&lt;br /&gt;Или может быть как всегда кривые руки? Но в чем тогда кривизна?&lt;br /&gt;&lt;br /&gt;Заранее спасибо.&lt;br /&gt;&lt;br /&gt;P.S.: Да, извините, я пробовал добавить тэги к этой запсис, но ЖЖ зачем-то заргулася и отказался это делать.&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ru-shell.livejournal.com/10049.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>paul_z</lj:poster>
  <lj:posterid>5263013</lj:posterid>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/9876.html</guid>
  <pubDate>Thu, 19 Jun 2008 10:24:02 GMT</pubDate>
  <title>Новичок и FTP</title>
  <link>http://ru-shell.livejournal.com/9876.html</link>
  <description>Простейшая проблема: не могу закачать локальный файл на ftp&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;br /&gt;если закачивать руками - то все получается, делаю так:&lt;br /&gt;&lt;i&gt;ftp -in ftp://username:pass@servername&lt;br /&gt;put filename.zip&lt;br /&gt;exit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Теперь делаю то же самое но через скрипт:&lt;br /&gt;&lt;i&gt;#!/usr/local/bin/bash&lt;br /&gt;ftp -in ftp://username:pass@servername&amp;lt;&amp;lt;_EOF_&lt;br /&gt;put filename.zip&lt;br /&gt;_EOF_&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Появляется ошибка:&lt;br /&gt;&lt;i&gt;...&lt;br /&gt;250 OK. Current Directory is /&lt;br /&gt;&amp;nbsp;remote: filename.zip&lt;br /&gt;: No such file or directory&lt;br /&gt;...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Что я делаю не так???&lt;br /&gt;&lt;br /&gt;В интернете все советуют делать примерно так:&lt;br /&gt;&lt;pre&gt;&amp;gt;&lt;i&gt;ftp -n &amp;lt;&amp;lt; __END_OF_SCRIPT__&lt;br /&gt;&lt;/i&gt;&amp;gt;&lt;i&gt;     open my.server.at.my.office&lt;br /&gt;&lt;/i&gt;&amp;gt;&lt;i&gt;     binary&lt;br /&gt;&lt;/i&gt;&amp;gt;&lt;i&gt;     user userid password&lt;br /&gt;&lt;/i&gt;&amp;gt;&lt;i&gt;     get myfile.gif&lt;br /&gt;&lt;/i&gt;&amp;gt;&lt;i&gt;     bye&lt;br /&gt;&lt;/i&gt;&amp;gt;&lt;i&gt;__END_OF_SCRIPT__&lt;/i&gt;&lt;/pre&gt;Возникает ошибка:&lt;br /&gt;ftp: hostname nor servername provided, or not known&lt;br /&gt;&lt;br /&gt;Help me, мозги уже закипают потихоньку.&lt;br /&gt;&lt;/div&gt;</description>
  <comments>http://ru-shell.livejournal.com/9876.html</comments>
  <category>ftp</category>
  <lj:security>public</lj:security>
  <lj:poster>my_nick_kos_mos</lj:poster>
  <lj:posterid>11107348</lj:posterid>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ru-shell.livejournal.com/9720.html</guid>
  <pubDate>Thu, 05 Jun 2008 10:44:50 GMT</pubDate>
  <title>Mac OS X 10.5.x и NAT</title>
  <link>http://ru-shell.livejournal.com/9720.html</link>
  <description>Вот модифицированный мной скрипт &lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.macosxhints.com/users.php?mode=profile&amp;amp;uid=60377&quot; rel=&quot;nofollow&quot;&gt;                 tejinashi&lt;/a&gt;, делающий в макоси нат&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;#/bin/bash&lt;br /&gt;interface=&quot;$2&quot;&lt;br /&gt;from_ip=&quot;any&quot;&lt;br /&gt;to_ip=&quot;any&quot;&lt;br /&gt;&lt;br /&gt;if [ &quot;`whoami`&quot; != &apos;root&apos; ] ; then&lt;br /&gt;&amp;nbsp; echo &quot;Go away, you are not root&quot;&lt;br /&gt;&amp;nbsp; exit 1&lt;br /&gt;fi&lt;br /&gt;case $1 in&lt;br /&gt;start)&lt;br /&gt;if [ &quot;$interface&quot; = &quot;&quot; ] ; then&lt;br /&gt;&amp;nbsp; echo &quot;I need an interface to NAT on&quot;&lt;br /&gt;&amp;nbsp; exit 1&lt;br /&gt;fi&lt;br /&gt;echo &quot;you may need to run &apos;ipfw flush&apos;&quot;&lt;br /&gt;natd=`ps awux |grep -v grep|grep -v $0|grep natd|awk &apos;{print $2}&apos;`&lt;br /&gt;kill -9 $natd&lt;br /&gt;sleep 1&lt;br /&gt;sysctl -w net.inet.ip.forwarding=1&lt;br /&gt;alias_ip=$(ifconfig $interface | grep inet | grep -v inet6 | \&lt;br /&gt;&amp;nbsp;awk &apos;{print $2}&apos; | head -1)&lt;br /&gt;/usr/sbin/natd -alias_address $alias_ip -interface $interface -use_sockets \&lt;br /&gt;&amp;nbsp;-same_ports -unregistered_only -dynamic -clamp_mss&lt;br /&gt;#ipfw -f flush&lt;br /&gt;ipfw add divert natd ip from &quot;$from_ip&quot; to &quot;$to_ip&quot; via &quot;$interface&quot;&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;ipfw -f flush&lt;br /&gt;sysctl -w net.inet.ip.forwarding=0&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo &quot;Usage: $0 start en0 OR $0 stop&quot;;&lt;br /&gt;;;&lt;br /&gt;esac&lt;/div&gt;</description>
  <comments>http://ru-shell.livejournal.com/9720.html</comments>
  <category>mac os</category>
  <category>bash</category>
  <category>nat</category>
  <lj:security>public</lj:security>
  <lj:poster>grohman</lj:poster>
  <lj:posterid>5788850</lj:posterid>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>

