Назад | Перейти на главную страницу

Bash 1 liner: Как создать каталог на каждый час с 00 по 23?

Процесс будет записывать в набор каталогов, по одному на каждый час, используя запись date +% H, поэтому 00, 01, 02 ... 22, 23. Я хочу сохранить начальный 0 в однозначных часах, чтобы сохранить отсортированные списки аккуратные.

I = 00; до [$ I -gt 23]; сделать mkdir $ I; пусть I = I + 1; сделано

Имеет предсказуемые эффекты, заключающиеся в отсутствии ведущего 0 перед одиночными цифрами. Я мог бы просто пойти и сделать их вручную, но чувствую, что должен быть способ сделать это. Любые идеи?

mkdir {0{0..9},{10..23}}

Или в Bash 4:

 mkdir {00..23}
mkdir $(seq -w 00 23)
for i in `seq -w 00 23`;do mkdir $i;done

Вот полностью переносимый ответ (для любой производной от Борна оболочки практически в любой системе, которая может запускать одну из них), тогда как все остальные ответы, по крайней мере, немного непереносимы, либо полагаются на непереносимые конструкции оболочки, либо seq, что распространено, но ни в одном POSIX ни универсальный:

# start with a blank/clean "dirs" variable
dirs=
# iterate over the first digit
for i in 0 1 2
do
    # ..and the second digit for each first digit
    for j in 0 1 2 3 4 5 6 7 8 9
    do
        # add each digit combination to the dirs list
        dirs=$dirs\ $i$j
        # ..until we reach 23 - then we're done.
        case $i$j in 23) break 2; esac
    done
done
# finally make the directories
mkdir $dirs

Некоторые примечания:

Первоначально создание каталогов гарантирует, что мы случайно не используем значение переменной среды с именем dirs, если мы унаследуем его.

На самом деле мы могли бы пропустить создание $dirs переменная и просто вызовите mkdir $i$j. Но этот способ работает лучше (запускается один процесс mkdir вместо 24) и такой же переносимый (если по какой-то случайности действительно существует система mkdir может принимать только один аргумент каталога *, это легко адаптировать для вызова mkdir для каждого $i$j комбинация вместо построения $dirs переменная).

Отсутствие цитирования везде и намеренно, и правильно. Замены не нужно заключать в кавычки внутри присвоений переменных и в первой части case заявление: они не подвергаются разделению поля в этих местах. И в mkdir строчку в конце, мы полагаемся на разделение полей для разделения списка каталогов на отдельные имена / аргументы для mkdir.

* «Официально» MS-DOS и Windows имеют mkdir который принимает только одно имя каталога, но, по крайней мере, в Windows 7 он работает с несколькими именами каталогов, плюс любой порт Bourne-подобной оболочки для тех систем, о которых я знаю, поставляется с собственными mkdir, и только такие чудаки, как я, могли бы даже подумать об этом уровне переносимости.