Лайнер Bash 1: Как сделать каталог в течение каждого часа, 00 к 23?

Я еще не могу прокомментировать, но что относительно различия между MyISAM и INNODB? Я не уверен, что можно просто сделать блокировку таблицы с INNODB и ожидать хороший снимок.

3
задан 11 November 2009 в 17:22
4 ответа
mkdir $(seq -w 00 23)
12
ответ дан 3 December 2019 в 04:36
mkdir {0{0..9},{10..23}}

Или в Bash 4:

 mkdir {00..23}
13
ответ дан 3 December 2019 в 04:36
  • 1
    +1 для того, чтобы не порождать подпроцесс. –  James Sneeringer 11 November 2009 в 18:10
  • 2
    +1, от моего IRC болтайтесь: " seq (1) является очень нестандартной внешней командой, используемой для подсчета к 10 в глупых практических руководствах Linux. Используйте один из них вместо этого: для x в {1.. 10} (bash3.x) или для ((x=1; x< =10; x ++)) (колотят 2.04 +), или i=1; в то время как [$i - le 10]; сделайте...; $ i= (($i+1)); сделанный (ksh/POSIX) " –  Kyle Brandt 11 November 2009 в 20:46
  • 3
    По крайней мере, в Bash, можно сделать ((i++)) для постепенного увеличения счетчика в while цикл (или в другом месте). Кроме того, при использовании двойных круглых скобок, можно использовать <= и кончить $: i=1; while ((i<=10)); do echo $i; ((i++)); done. –  Paused until further notice. 11 November 2009 в 21:16
for i in `seq -w 00 23`;do mkdir $i;done
6
ответ дан 3 December 2019 в 04:36

Вот полностью переносимый ответ (на любую оболочку, полученную от Борна, на практически любой системе, которая может работать с такой системой), в то время как все остальные ответы, по крайней мере, немного переносимые, либо полагаются на переносимые конструкции оболочек, либо 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 он работает с несколькими именами каталогов, плюс любой порт оболочки типа Борна на те системы, которые, как я знаю, поставляется со своим собственным mkdir, и только такие чудаки, как я, могут даже подумать о таком уровне переносимости.

.
3
ответ дан 3 December 2019 в 04:36

Теги

Похожие вопросы