Здравствуйте!
Подскажите пож-ста, как организовать кольцевую сортировку. Суть такова - в каталоге создаются файлики 001....999, которые надо обрабатывать по порядку, даже не обязательно по порядку, но не затрагивая последнего, в который пишутся данные. А могут и не писаться, режим ожидания, но файлик уже существует. Сортировка по временам доступа/модификации не подходит, могут совпадать вплоть до миллисекунд. Единственно надёжный критерий - имя, эти самые 001...999. В одномоментном снимке содержания каталога при одновременном наличии 001 и 999 они отсортируются неверно при обычной сортировке, надо наоборот, сначала 999, потом 001. Подкиньте идею, кто может))
На что меня хватило. До 999 работает, дальше нет.
mv `ls -1d $RECDIR/* | head -n1` $PROCDIR
bash сортировка кольцевая
Модератор: Модераторы разделов
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash сортировка кольцевая
$
$ for f in *; do file $f; done
001: empty
002: empty
005: empty
$
$ while read f; do file $f; done < <(ls)
001: empty
002: empty
005: empty
$ while read f; do file $f; done < <(ls -r)
005: empty
002: empty
001: empty
мощный вариант:
$
$ while read f; do file $f; done < <(find -type f -printf "%f\n" | sort -nr)
20: empty
005: empty
03: empty
002: empty
001: empty
-
- Сообщения: 2599
- ОС: gentoo fluxbox
Re: bash сортировка кольцевая
Это ж всё аналоги ls-сортировки, обычной по ранжиру)) По кольцу 001->999->001 и т.д. Это ж получается LILO (загрузчик ни при чём)), last in last out) Причём может накапливаться в каталоге до десятка необработанных файлов.
В инете негусто почему-то про кольцевую сортировку. Или я это несуразное название придумал? Попробую LILO поискать.
Ага, при некоторых раздумьях, это всё-таки не сортировка нужна, а именно буфер LILO, сортировка тут вторична. НО в чистом виде LILO невозможен, так как недостоверные таймстампы, вот против этого и нужна сортировка. ВОзможен ли стек на шелле?
В инете негусто почему-то про кольцевую сортировку. Или я это несуразное название придумал? Попробую LILO поискать.
Ага, при некоторых раздумьях, это всё-таки не сортировка нужна, а именно буфер LILO, сортировка тут вторична. НО в чистом виде LILO невозможен, так как недостоверные таймстампы, вот против этого и нужна сортировка. ВОзможен ли стек на шелле?
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash сортировка кольцевая
this
да. Вот только LILO это НЕ стек, а очередь. Вот вам стек(LIFO):
Код: Выделить всё
#!/bin/bash
declare -a STACK
SP=0
X=
push()
{
STACK[$SP]="$1"
(( SP++ ))
}
pop()
{
(( SP-- ))
X="${STACK[$SP]}"
}
for S in "first" "second" "third"; do
push "$S"
done
while (( SP != 0 )); do
pop
echo "$X"
done
какой нафиг "lilo"??? LIFO!
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash сортировка кольцевая
PS: FIFO на массиве сделать естественно не получится, если только не известен максимальный размер очереди.
вот на 100
вот на 100
Код: Выделить всё
#!/bin/bash
declare -a QUEUE
X=
BEGIN=0
END=0
S_SIZE=100
append_queue()
{
QUEUE[$END]="$1"
(( END++ ))
if (( END >= S_SIZE )); then
END=0
fi
}
remove_queue()
{
X="${QUEUE[$BEGIN]}"
(( BEGIN++ ))
if (( BEGIN >= S_SIZE )); then
BEGIN=0
fi
}
for S in "first" "second" "third"; do
append_queue "$S"
done
while (( BEGIN != END )); do
remove_queue
echo "$X"
done
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash сортировка кольцевая
при чём тут ваще ваши таймстампы???
вот вам до кучи сортированный список:
Код: Выделить всё
#!/bin/bash
declare -a QUEUE
X=
COUNT=0
append_queue()
{
INDEX="$1"
while [ "$INDEX" != "${INDEX#0}" ]; do
INDEX="${INDEX#0}"
done
QUEUE[$INDEX]=$COUNT
(( COUNT++ ))
}
for S in "1" "2" "007" "3" "000028"; do
append_queue "$S"
done
for X in "${!QUEUE[@]}"; do
echo "$X COUNT=${QUEUE[$X]}"
done
-
- Сообщения: 2599
- ОС: gentoo fluxbox
Re: bash сортировка кольцевая
-001->...007->068...->564...->999-
^___________________________________|
LILO, или кольцо получается. Только вот дополняя первое сообщение, могу сказать, этим файликам делается "mv" в место обработки, потом они появляются вновь. В каталоге может быть или только один файл (последний, ожидающий записи), или до нескольких предыдущих вкупе с этим последним, если за цикл проверки=1минуту успели посоздаваться требующие дальнейшей обработки.
(drBatty) писал(а):при чём тут ваще ваши таймстампы???
Первый (или последний) [вошёл (или вышел)] - подразумевает время. Это ведь действительно не стек в процессоре, где доступ только через вершину (ну или через подкоп:-) Тут можно и сбоку вытащить
Кстати, осенила тут мысль, что придуманный мной LILO по сути тот же FIFO. Или есть различие? Формально-то есть, а вот на деле.... Пошёл пробовать FIFO
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: bash сортировка кольцевая
Э-э-э... Может я чего не понял...yoricI писал(а): ↑18.03.2014 20:25Подскажите пож-ста, как организовать кольцевую сортировку. Суть такова - в каталоге создаются файлики 001....999, которые надо обрабатывать по порядку, даже не обязательно по порядку, но не затрагивая последнего, в который пишутся данные. А могут и не писаться, режим ожидания, но файлик уже существует.
Но почему нельзя этот последний файлик положить в отдельный каталог (находящийся здесь же) и писать туда результаты, а остальные файлы обрабатывать так, как хочется?
Тогда результирующий затронут не будет и сортировка не понадобится.
Ещё вариант: дать результирующему файлу имя, отличное от [0-9][0-9][0-9]. и обрабатывать файлы по маске.
Но с отдельным каталогом, по-моему проще.
Не подойдет?
-
- Сообщения: 2599
- ОС: gentoo fluxbox
Re: bash сортировка кольцевая
С FIFO не получилось
Или я плохо объяснил))
Положить можно хоть куда, но следующие будут там же. Программа (sox) пишет звук, по тишине завершает файл и открывает новый, с возросшим номером-именем. И так до 999, потом снова 001. Вот я и хотел переносить старые отработанные записанные файлы в другое место и "делай с ними что хошь". Не думал, что такая проблема выплывет, придётся перезапускать программу, можно потерять некоторое время записи. И имя другое не дашь, в демоническом режиме sox именует файлы по порядку % - 001-999. Так что увы
("fflatx") писал(а):Может я чего не понял...
Или я плохо объяснил))
Положить можно хоть куда, но следующие будут там же. Программа (sox) пишет звук, по тишине завершает файл и открывает новый, с возросшим номером-именем. И так до 999, потом снова 001. Вот я и хотел переносить старые отработанные записанные файлы в другое место и "делай с ними что хошь". Не думал, что такая проблема выплывет, придётся перезапускать программу, можно потерять некоторое время записи. И имя другое не дашь, в демоническом режиме sox именует файлы по порядку % - 001-999. Так что увы
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: bash сортировка кольцевая
Можно определять, какой файл занят sox'ом и переносить все, кроме него.
-
- Сообщения: 2599
- ОС: gentoo fluxbox
Re: bash сортировка кольцевая
Неплохая идея. Формируем список файлов, по одному, проверяем на занятость, свободен - на выход. Попробую оформить.
Очередь тяжёлых заданий на BASH для общего развития
if [ `fuser /dev/snd/pcmC0Dp > /dev/null 2>&1; echo $?` != 0 ]; then echo 'файл свободен'; else echo 'файл занят'; fi
работает
Очередь тяжёлых заданий на BASH для общего развития
if [ `fuser /dev/snd/pcmC0Dp > /dev/null 2>&1; echo $?` != 0 ]; then echo 'файл свободен'; else echo 'файл занят'; fi
работает
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash сортировка кольцевая
развивайтесь самостоятельно.