<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bappoy&#039;s blog &#187; perl</title>
	<atom:link href="http://bappoy.pp.ru/tag/perl/feed" rel="self" type="application/rss+xml" />
	<link>http://bappoy.pp.ru</link>
	<description>Линуксоид на велосипеде с моторчиком</description>
	<lastBuildDate>Fri, 02 Dec 2011 11:44:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Конвертация Unix-style путей в UNC в Midnight Commander</title>
		<link>http://bappoy.pp.ru/2011/06/25/mc-unc-path.html</link>
		<comments>http://bappoy.pp.ru/2011/06/25/mc-unc-path.html#comments</comments>
		<pubDate>Sat, 25 Jun 2011 11:19:14 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mc]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=970</guid>
		<description><![CDATA[<p>Тестовые релизы нашего продукта мы выкладываем в шару \\fs\testing, а готовые сборки и обновления для клиентов — в \\fs\release. У меня эти шары примонтированы соответственно как /mnt/testing и /mnt/release, и при составлении писем о выпуске релиза приходится вручную менять пути вида /mnt/testing/product/version_major/version_minor на \\fs\testing\product\&#8230; </p>
<p>Однажды мне это надоело и я добавил такую запись в ~/.mc/menu:</p>
<pre>+ d /mnt/
p   Copy path in windows format to clipboard
    pwd|perl -ne 's|^/([^/])|//\1|g; s|/mnt/(products\|testing)|/fs/\1|g; s|/|\\|g;print'|xclip &#038;</pre>
<p>Теперь, если текущий каталог в Midnight Commander начинается на &laquo;/mnt/&raquo;, в меню F2 появляется пункт &laquo;Convert path to windows format&raquo;, при активации которого в буфер обмена помещается &laquo;правильный&raquo; UNC-путь к текущему каталогу.</p>
<p>О том, почему в Windows используются неправильные слэши, можно узнать из <a href="http://habrahabr.ru/blogs/testing/120652/">этой статьи</a>.</p>
<p><em>Заметка из черновиков годовой давности, сейчас выкладываю другие релизы в другие шары :)</em></p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2011/06/25/mc-unc-path.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Построение регулярного выражения по списку строк</title>
		<link>http://bappoy.pp.ru/2009/08/18/building-list-based-regexp.html</link>
		<comments>http://bappoy.pp.ru/2009/08/18/building-list-based-regexp.html#comments</comments>
		<pubDate>Tue, 18 Aug 2009 11:40:34 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=747</guid>
		<description><![CDATA[<p>Имеется неколько десятков однотипных файлов вида <code>FILE20090801011253.txt</code>, <code>FILE20090801023619.txt</code> и т.д. Требуется составить регулярное выражение, которому удовлетворяют только названия файлов из списка.</p>
<p>Вручную это можно сделать примерно так:</p>
<pre>FILE200908010(11253|23619)\.txt</pre>
<p>Если файлов много, то никаких нервов не хватит высчитывать, проверять и перепроверять.</p>
<p>То же самое можно сделать полуавтоматически, с помощью механизма <b>complete-into-braces</b> оболочки bash. Сочетание клавиш <b>Esc-{</b> преобразовывает список подстановки в более-менее оптимальный формат brace-completion, пригодный для дальнейшей обработки:</p>
<pre>$ echo /path/to/dir/(<b>Esc-{</b>)FILE200908010{11253.txt,23619.txt}</pre>
<p>Чтобы из получившейся строки сделать нормальный регэксп, нужно фигурные скобки заменить на круглые, а запятые — на вертикальную черту:</p>
<pre>echo "FILE200908010{11253.txt,23619.txt} "|sed -e 's/{/(/g' -e 's/}/)/g' -e 's/,/|/g'</pre>
<p>Приходится делать много лишних слабоавтоматизируемых действий, после чего копировать, вставлять, заменять и исправлять, что не очень удобно.</p>
<p>После непродолжительных поисков был найден Perl&#8217;овый модуль <a href="http://search.cpan.org/~dankogai/Regexp-Optimizer-0.15/lib/Regexp/List.pm">Regexp::List</a>, функцию list2re (преобразование списка в регулярное выражение) из которого можно приспособить под любые подобные задачи. Вот, например, сокращенная версия скрипта для моего случая:</p>
<pre>use Regexp::List;
my $l=Regexp::List->new;
$l->set(lookahead=>0);

opendir(D,"/path/to/dir") or die "Could not open $dir: $!";
my @list=grep {$_!~/^\.\.?$/ } readdir(D);          # get directory entries except "." and ".."
closedir(D);

my $re = $l->list2re(@list);                        # create regexp from @list
$re=~s/^\(\?-[xism]+:(.*?)\)$/^$1\$/g;              # strip "(?:-xism" and ")"
print "$re\n";</pre>
<p>Для следующих десяти файлов:</p>
<pre>FILE20090802120343.txt
FILE20090802165139.txt
FILE20090802181550.txt
FILE20090804014529.txt
FILE20090804140848.txt
FILE20090805103525.txt
FILE20090805104025.txt
FILE20090810083211.txt
FILE20090810120349.txt
FILE20090810121250.txt</pre>
<p>Скрипт выдает такой результат:</p>
<pre>^FILE200908(?:0(?:510(?:40|35)25\.txt|21(?:81550|20343|65139)\.txt|4(?:140848|014529)\.txt)|10(?:12(?:1250|0349)\.txt|083211\.txt))$</pre>
<p>Что и требовалось.</p>
<div style="font-size:85%;padding-top:2em;"><em>Пользуясь случаем, хочу порекламировать PDF-версию третьего издания книги <a href="http://www.books.ru/shop/books/626982?partner=532333">&laquo;Регулярные выражения&raquo;</a> Джеффри Фридла</em></div>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2009/08/18/building-list-based-regexp.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Читаете ли вы perlop?</title>
		<link>http://bappoy.pp.ru/2009/06/03/reading-perldoc.html</link>
		<comments>http://bappoy.pp.ru/2009/06/03/reading-perldoc.html#comments</comments>
		<pubDate>Wed, 03 Jun 2009 14:30:13 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perldoc]]></category>
		<category><![CDATA[переводы]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=660</guid>
		<description><![CDATA[<p>Еще немного про perl. Перелистывая Perl Cookbook, вдруг осознал, что никогда не задумывался о возможностях оператора диапазона &laquo;<code>..</code>&laquo;. То есть, конечно, понятно, что в списковом контексте он вернет список значений от левого операнда до правого и конструкция <code>foreach(1 .. 5)</code> превратится в начало натурального ряда. А вот про то, что в скалярном контексте этот оператор ведет себя наподобие диапазона в sed, я не знал. Например, часто возникающая задача &laquo;сделать что-то с данными между открывающей и закрывающей строкой&raquo; решается просто и элегантно:</p>
<pre>perl -ne 'print if /&lt;Directory /i .. /&lt;\/Directory&gt;/i' httpd.conf</pre>
<p>Благодаря кажущейся простоте этого оператора (зачем читать доку про такие элементарные вещи, если в первом попавшемся букваре по перлу написано, что именно делает этот оператор) редкая птица удосужится ознакомиться с описанием <code>..</code> в perlop, что и приводит к подобным открытиям. </p>
<p>Не последнюю роль тут играет и местами довольно сложный язык документации. Но мир меняется к лучшему и недавно на <a href="http://translated.by">translated.by</a> в рамках проекта <a href="http://github.com/sharifulin/pod2-ru/tree">pod2-ru</a> под руководством <a href="http://sharifulin.livejournal.com/">Анатолия Шарифулина</a> народ принялся за  перевод <a href="http://translated.by/you/tags/Perl/">perldoc</a>. К настоящему моменту уже переведены: <a href="http://translated.by/you/perlbook/">perlbook</a>, <a href="http://translated.by/you/perldoc/">perldoc</a>, <a href="http://translated.by/you/perlpragma/">perlpragma</a>, <a href="http://translated.by/you/perlstyle/">perlstyle</a>; на подходе <a href="http://translated.by/you/perlintro/trans/">perlintro</a> и в процессе одна из центральных страниц документации — <a href="http://translated.by/you/perlfunc/trans/">perlfunc</a>. Также переведена примерно половина <a href="http://translated.by/you/perlboot-beginner-s-object-oriented-tutorial-1/trans/">perlboot</a>. Так что если есть желание и возможность помочь в переводе документации perl, присоединяйтесь к любому из этих переводов или начинайте свой. Даже с минимальными знаниями английского языка вы можете помочь в качестве редактора или корректора. В общем, внесите уже свой вклад в open source :)</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2009/06/03/reading-perldoc.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Приоритеты операторов в Perl</title>
		<link>http://bappoy.pp.ru/2009/05/15/perl-op-precedence.html</link>
		<comments>http://bappoy.pp.ru/2009/05/15/perl-op-precedence.html#comments</comments>
		<pubDate>Fri, 15 May 2009 10:46:20 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[pitfalls]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=633</guid>
		<description><![CDATA[<p>Отлаживая один скрипт, в очередной раз напоролся на банальные грабли, иллюстрирующие красоту и мощь языка Perl.</p>
<p>Сначала был примерно такой код:</p>
<div style="background:#000000;color:#ffffff; font-family:Courier,'Lucida Console','Courier New', Sans-Serif;overflow:auto;padding:0.5em;border: 1px solid #eeeeee;margin:10px;font-weight:bold;">
<font color="#ffff00"><b>while</b></font>(<font color="#00ffff"><b>&lt;STDIN&gt;</b></font>)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00"><b>if</b></font>((<font color="#00ffff"><b>$name</b></font>) = <font color="#00ffff"><b>$_</b></font> =~ <font color="#ffff00"><b>/</b></font><font color="#ff40ff"><b>^</b></font><font color="#ff6060"><b>\s</b></font><font color="#ff6060"><b>*</b></font><font color="#ff40ff"><b>source </b></font><font color="#ff6060"><b>(.*)</b></font><font color="#ff6060"><b>\.</b></font><font color="#ff40ff"><b>sql</b></font><font color="#ffff00"><b>/i</b></font>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00"><b>if</b></font>&nbsp;(<font color="#00ffff"><b>&amp;function</b></font>&nbsp;<font color="#00ffff"><b>$name</b></font>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ffff"><b># do something with $name</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<p>Логично было бы объединить два условия в одно:</p>
<div style="background:#000000;color:#ffffff; font-family:Courier,'Lucida Console','Courier New', Sans-Serif;overflow:auto;padding:0.5em;border: 1px solid #eeeeee;margin:10px;font-weight:bold;">
<font color="#ffff00"><b>while</b></font>(<font color="#00ffff"><b>&lt;STDIN&gt;</b></font>)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00"><b>if</b></font>((<font color="#00ffff"><b>$name</b></font>) = <font color="#00ffff"><b>$_</b></font> =~ <font color="#ffff00"><b>/</b></font><font color="#ff40ff"><b>^</b></font><font color="#ff6060"><b>\s</b></font><font color="#ff6060"><b>*</b></font><font color="#ff40ff"><b>source </b></font><font color="#ff6060"><b>(.*)</b></font><font color="#ff6060"><b>\.</b></font><font color="#ff40ff"><b>sql</b></font><font color="#ffff00"><b>/i</b></font>&nbsp;&amp;&amp; <font color="#00ffff"><b>&amp;function</b></font>&nbsp;<font color="#00ffff"><b>$name</b></font>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ffff"><b># do something with $name</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<p>Но после этого условие стало выполняться для каждой строки STDIN, вне зависимости от того, совпадает она с шаблоном или нет. Попробуем разобраться.</p>
<p>Для простоты рассмотрим однострочник на Perl, локализующий эту проблему:</p>
<div style="background:#000000;color:#ffffff; font-family:Courier,'Lucida Console','Courier New', Sans-Serif;overflow:auto;padding:0.5em;border: 1px solid #eeeeee;margin:10px;font-weight:bold;"><font color="#ffff00"><b>echo</b></font><font color="#ff40ff"><b>&nbsp;o</b></font>|perl <font color="#ff6060"><b>-ne</b></font>&nbsp;<font color="#ffff00"><b>&#39;</b></font><font color="#ff40ff"><b>print &quot;aga\n&quot; if (($o) = $_ =~ /(a)/ &amp;&amp; 1)</b></font><font color="#ffff00"><b>&#39;</b></font></div>
<p>Здесь в одном условии встречаются три оператора: присваивания <code>=</code>, привязки <code>=~</code>, а также логическое И <code>&#038;&#038;</code>. Согласно <code>perldoc&nbsp;perlop</code>, оператор присваивания имеет более низкий приоритет, чем два остальных, поэтому выполняется последним, и код можно представить в виде:</p>
<div style="background:#000000;color:#ffffff; font-family:Courier,'Lucida Console','Courier New', Sans-Serif;overflow:auto;padding:0.5em;border: 1px solid #eeeeee;margin:10px;font-weight:bold;"><font color="#ffff00"><b>echo</b></font><font color="#ff40ff"><b>&nbsp;o</b></font>|perl <font color="#ff6060"><b>-ne</b></font>&nbsp;<font color="#ffff00"><b>&#39;</b></font><font color="#ff40ff"><b>print &quot;aga\n&quot; if (($o) = <span style="font-size:170%">(</span> $_ =~ /(a)/ &amp;&amp; 1 <span style="font-size:170%">)</span> )</b></font><font color="#ffff00"><b>&#39;</b></font></div>
<p>Логическая операция в больших скобках в списковом контексте возвращает  массив, содержащий пустое значение, операция присваивания выполняется успешно и условие выполняется.</p>
<p>Поэтому при объединении условий всегда нужно проверять приоритеты операторов и группировать условия вручную:</p>
<div style="background:#000000;color:#ffffff; font-family:Courier,'Lucida Console','Courier New', Sans-Serif;overflow:auto;padding:0.5em;border: 1px solid #eeeeee;margin:10px;font-weight:bold;">while<font color="#8080ff"><b>(</b></font><font color="#ff6060"><b>&lt;STDIN&gt;</b></font><font color="#8080ff"><b>)</b></font><br /><font color="#ff6060"><b>{</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;if<font color="#ffff00"><b>(</b></font>&nbsp;<font color="#ffff00"><b><span style="font-size:170%">(</span></b></font>&nbsp;<font color="#ffff00"><b>(</b></font><font color="#8080ff"><b>$name</b></font><font color="#ffff00"><b>)</b></font><font color="#ffff00"><b>=</b></font><font color="#8080ff"><b>$_</b></font><font color="#ffff00"><b>=</b></font>~/^<font color="#ff6060"><b>\s</b></font>*source <font color="#ffff00"><b>(</b></font>.*<font color="#ffff00"><b>)</b></font><font color="#ff6060"><b>\.</b></font>sql/i <font color="#ffff00"><b><span style="font-size:170%">)</span></b></font>&nbsp;<font color="#ffff00"><b>&amp;&amp;</b></font>&nbsp;<font color="#00ffff"><b>&amp;function</b></font> <font color="#8080ff"><b>$name</b></font><font color="#ffff00"><b>)</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff6060"><b>{</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ffff"><b># do something with $name</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff6060"><b>}</b></font><br />
<font color="#ff6060"><b>}</b></font></div>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2009/05/15/perl-op-precedence.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>fortune в подписи thunderbird</title>
		<link>http://bappoy.pp.ru/2008/04/29/thunderbird-signature.html</link>
		<comments>http://bappoy.pp.ru/2008/04/29/thunderbird-signature.html#comments</comments>
		<pubDate>Mon, 28 Apr 2008 20:40:23 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[lifehack]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/2008/04/29/thunderbird-signature/</guid>
		<description><![CDATA[<p>Что мы имеем на текущий момент:</p>
<ul>
<li>thunderbird в качестве почтового клиента. Многим лучше, немногим хуже монстроидальных и неповоротливых Outlook и Evolution. Один из недостатков &#8212; невозможность редактирования шаблонов без использования дополнений, что приводит к необходимости каждый раз вручную вставлять подпись.</li>
<li>непреодолимое желание нести свет в корпоративные массы путём включения избранных linux-related цитат из сборника fortune linuxcookie</li>
</ul>
<p>В настройках учётной записи thunderbird есть специальная галка &laquo;использовать файл подписи&raquo;. Эту фичу и заюзаем для того, чтобы в каждое письмо вставлять подпись в соответствии с корпоративным стандартом и приплюсовывать туда что-нибудь забавное и правильное из fortune.</p>
<p>Для того, чтобы у получателя была возможность отличить собственно подпись от цитаты, буквально взявшейся с потолка, каждую строчку цитаты будем предварять традиционным для c-программистов сочетанием символов &laquo;//&raquo;.</p>
<p>Ничтоже сумняшеся, набросал небольшой скрипт на любимом средстве мыслевыражения &#8212; perl-е:</p>
<blockquote>
<pre><font color="#444444">#!/usr/bin/perl -w</font><strong>
use</strong> strict;<strong>

my</strong> <font color="#2040a0">$sign</font>=<font color="#008000">"/path/to/home/signature.txt"</font>;
<font color="#a52a2a"><strong>open</strong></font><font color="#4444ff"><strong>(</strong></font>F,<font color="#008000">"&gt;</font><font color="#2040a0">$sign</font>"<font color="#4444ff"><strong>)</strong></font> || <strong>die</strong> <font color="#008000">"Could not open </font><font color="#2040a0">$sign</font>: <font color="#2040a0">$!</font><font color="#77dd77">\n</font>";<strong>
my</strong> <font color="#2040a0">$fortune</font>=`fortune linuxcookie`;<font color="#a52a2a"><strong>
chomp</strong></font> <font color="#2040a0">$fortune</font>;<font color="#a52a2a"><strong>
undef</strong></font><font color="#4444ff"><strong>(</strong></font><font color="#2040a0">$</font>/<font color="#4444ff"><strong>)</strong></font>;
<font color="#2040a0">$fortune</font>=~<font color="#b000d0">s|\n|\n// |g</font>;<strong>
while</strong><font color="#4444ff"><strong>(</strong></font>&lt;DATA&gt;<font color="#4444ff"><strong>)</strong></font><font color="#4444ff"><strong>{
</strong></font>    <font color="#b000d0">s/\{fortune\}/$fortune/g</font>;
    <font color="#a52a2a"><strong>print</strong></font> F;<font color="#4444ff"><strong>
}</strong></font><font color="#a52a2a"><strong>
close</strong></font> F;<strong>
exit</strong> 0;

__DATA__
Best regards,
John Doe
Company
Department
Software Engineer

//  {fortune}</pre>
</blockquote>
<p>Поместив команду запуска этого скрипта в свой собственный crontab (man 1 crontab, см. также предыдущую запись), получаем обновляемый раз в минуту файл ~/signature.txt, который можно указать thunderbird&#8217;у как файл подписи. Что и требовалось.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2008/04/29/thunderbird-signature.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Организация рабочих файлов по неделям</title>
		<link>http://bappoy.pp.ru/2008/04/28/weekly-folders.html</link>
		<comments>http://bappoy.pp.ru/2008/04/28/weekly-folders.html#comments</comments>
		<pubDate>Mon, 28 Apr 2008 13:38:12 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[lifehack]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/2008/04/28/weekly-folders/</guid>
		<description><![CDATA[<p>Ежедневно в моей рабочей папке появлялось от одного до полутора десятков и более файлов &#8212; документов, патчей, скриптов, отчётов и прочих продуктов рабочей деятельности. Однажды настал момент, когда найти нужный файл среди этого бардака стало довольно затруднительно, и чаша моего терпения переполнилась. Файлы нужно каким-нибудь организовать, подумал я. Изобретать систему меток для организации файлов по <strike>фэн-шую</strike> GTD было лень, поэтому я просто остановился на принципе &laquo;одна неделя &#8212; одна папка&raquo;, т.е. все файлы хранятся в папках вида ~/work/week18, к текущей и предыдущей неделе можно обратиться по ссылкам ~/work/current и ~/work/prev.</p>
<p>Для начала я соорудил скрипт для раскидывания файлов по папкам, создающий в текущей директории папки с именами в нужном формате, если их не существует, и перемещающий туда файлы:</p>
<blockquote>
<pre><font color="#444444">#!/usr/bin/perl -w</font>
<strong>use</strong> File::<font color="#a52a2a"><strong>stat</strong></font>;
<strong>use</strong> POSIX <font color="#a52a2a"><strong>qw</strong></font><font color="#4444ff"><strong>(</strong></font>strftime<font color="#4444ff"><strong>)</strong></font>;
<strong>use</strong> strict;
<strong>foreach</strong><font color="#4444ff"><strong>(</strong></font>`find . -maxdepth 1 -type f |sed <font color="#008000">'s/</font><font color="#77dd77">\ </font>/<font color="#77dd77">\\</font> /g;'`<font color="#4444ff"><strong>)</strong></font><font color="#4444ff"><strong>{</strong></font>
<font color="#a52a2a"><strong>    chomp</strong></font>;
<strong>    my</strong> <font color="#2040a0">$st</font>=<font color="#a52a2a"><strong>stat</strong></font><font color="#4444ff"><strong>(</strong></font><font color="#2040a0">$_</font><font color="#4444ff"><strong>)</strong></font>||<strong>die</strong> <font color="#008000">"Could not stat </font><font color="#2040a0">$_</font>: <font color="#2040a0">$!</font><font color="#77dd77">\n</font>";
    <strong>my</strong> <font color="#2040a0">$week</font>=strftime<font color="#4444ff"><strong>(</strong></font><font color="#008000">"</font><font color="#2040a0">%W</font>",<font color="#a52a2a"><strong>localtime</strong></font><font color="#4444ff"><strong>(</strong></font><font color="#2040a0">$st</font>-&gt;mtime<font color="#4444ff"><strong>)</strong></font><font color="#4444ff"><strong>)</strong></font>;
    <strong>unless</strong><font color="#4444ff"><strong>(</strong></font>-d <font color="#008000">"week</font><font color="#2040a0">$week</font>"<font color="#4444ff"><strong>)</strong></font><font color="#4444ff"><strong>{</strong></font><font color="#a52a2a"><strong>mkdir</strong></font> <font color="#008000">"week</font><font color="#2040a0">$week</font>";<font color="#4444ff"><strong>}
</strong></font><font color="#a52a2a"><strong>    rename</strong></font><font color="#4444ff"><strong>(</strong></font><font color="#008000">"</font><font color="#2040a0">$_</font>",<font color="#008000">"week</font><font color="#2040a0">$week</font>/<font color="#2040a0">$_</font>"<font color="#4444ff"><strong>)</strong></font>||<strong>warn</strong> <font color="#008000">"Could not rename </font><font color="#2040a0">$_ to week$week/$_</font>: <font color="#2040a0">$!</font><font color="#77dd77">\n</font>";
<font color="#4444ff"><strong>}</strong></font></pre>
</blockquote>
<p>Затем создал скриптик для еженедельного создания новой папки и переименования ссылок current и prev:</p>
<blockquote>
<pre>
<font color="#0000ff"><strong>#!/bin/sh</strong></font>
<font color="#2040a0">current_week</font>=week`/bin/date <font color="#008000">"+%W"</font>`
test -L ~/work/prev &amp;&amp; rm ~/work/prev
mkdir -p ~/work/<font color="#2040a0">$current_week</font>
pushd ~/work
test -L current &amp;&amp; /bin/mv current prev
ln -s <font color="#2040a0">$current_week</font> current
popd</pre>
</blockquote>
<p>Запуск скриптика в первый день каждой недели (нулевой &#8212; воскресение, по американским традициям) поместил в свой crontab (если кто еще не в курсе, у каждого пользователя есть свой crontab, аналогичный общесистемному /etc/crontab; редактируется с помощью команды crontab -e, просматривается командой crontab -l; подробнее см. man 1 crontab):</p>
<blockquote>
<pre># crontab -l
1   0   *   *   1   ~/bin/weekly.sh</pre>
</blockquote>
<p>Ссылки на ~/work/current и ~/work/prev впоследствии была добавлены в в favorite folders в Gnome, а также во все места, где требуется быстрый доступ к рабочим материалам. Кроме того, в начале каждой новой недели при написании еженедельного отчета стало на порядок проще делать обзор работы за предыдущую неделю (конечно, список рабочих активностей не исчерпывается появившимися файлами; есть же еще и почта, и bug-tracker, и другие средства организации информации)Недостаток у данного скрипта пока один &#8212; нужно ежегодно архивировать накопившиеся 52 папки, иначе снова возникнет бардак :) Но и это исправляется при наличии желания и умения.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2008/04/28/weekly-folders.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

