22 Фев

Хитрости bash

Снова сегодня обнаружил в bash’е шикарные команды.
Расскажу один случай.
Не так давно я писал скрипт для автоматизации настроек новых серверов для chatroulette.com. Одной из задач было написать команду, которая создает некоторую структуру директорий для кеша проекта. А именно, скрипт/команда должна в определенной директории создать директории с именами 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 и в каждой из них тоже по 10 директорий с этими же именами (0-9).
На тот момент я сделал 3-4 варианта скрипта и остановился вот на таком:

for dir0 in `seq 0 9`; do mkdir /www/$dir0 && for dir1 in `seq 0 9`; do mkdir /www/$dir0/$dir1; done; done

Вобщем-то, в этой задаче самое хитрое — придумать кратчайший способ создания директорий от 0 до 9. В данном примере для создания директорий я воспользовался секвенцией seq. Сегодня я нашел куда более простой и понятный для этого способ. И так, показываю сразу новый вариант:

mkdir {0..9} && for dir in *; do mkdir $dir/{0..9}; done

Команда mkdir {n..m} создает директории с диапазоном имен от n до m.
В итоге, команда нехило сократилась и стала на порядок понятней даже новичкам.

UPD: Спасибо @sany, подсказал еще один шикарный способ, который, будучи очевидным, мне в голову даже не пришел :)

mkdir -p {0..9}/{0..9}