Вопрос к любителям bash-а.

Автор: nektofil Дата: 13.02.2008 20:27 Есть каталог с файлами данных. Файлы поименованы
по моменту сбора в формате YYYYmmDDHHMM. (200605121645)
Нужно найти файл, наиболее близкий к заданному моменту.

Пока задачу решил так:
---
#!/bin/bash
TARG=$1
DST=$(for f in `ls data/` ; do echo "$((TARG-f)) f" ; done |
tr -d '-' | sort -n | head -1)

echo ${DST##* }
---

Есть ли варианты как эту задачу решить по-другому?
Средствами баша естественно. Улыбка
Re: Вопрос к любителям bash-а. 15.02.2008 20:49smaharbA bc - но это не совсем баш, вернее совсем не баш
Re: Вопрос к любителям bash-а. 16.02.2008 11:48Юрий Клещетников Для этих целей можно отсортировать файлы по дате. Mille pardon, не помню какая команда, но точно есть.
Приеду домой, посмотрю и через пару дней напишу точно...
Re: Вопрос к любителям bash-а. 16.02.2008 15:36BigAndy А что? запарсить вывод find уже не кошерно?
Кстати, будет работать быстрее.
Re: Вопрос к любителям bash-а. 16.02.2008 20:46Юрий Клещетников Команда ls предназначена для чтения файлов и каталогов. Если указать опцию -a, то можно увидеть все файлы каталога. Опция -l показывает свойства файла (права). Опция -r сортирует файлы в обратном порядке. Опция -t сортирует файлы по времени. Опция -s сортирует по размеру файла. Опция -h выводит информацию о размерах файлов. В командной строке (терминале / оболочке) можно комбинировать опции, например, вместо ls -l -a -t -r можно написать ls -latr
Опции с двойным тире не группируют, а пишут отдельно.
Для навигации можно использовать клавиши PageDown и PageUp. Чтобы найти файлы с похожими именами можно использовать символы групповых операций (* - любое количество любых символов, включая точку или ? – один любой символ).
Для более детальной информации пользуйтесь командами справки, например, man ls, ls --help, info ls
Re: Вопрос к любителям bash-а. 16.02.2008 23:07kosmonavt >for f in `ls data/` ; do echo "$((TARG-f)) f" ; done

---
ls data/ | awk "{print $TARG-\$0,\$0}"
---
пошустрее будет.
Re: Вопрос к любителям bash-а. 18.02.2008 15:47nektofil to BigAndy & kosmonavt:

Спасибо!
Замена ls на find и bash+tr на awk уронило
время на 100000 входных данных с 5.4с до 1.4с!


to Юрий Клещетников & smaharbA:

За внимание -- спасибо.
Re: Вопрос к любителям bash-а. 18.02.2008 16:55smaharbA с каких это пор файнд быстрее ?
лс этож просто стат, а файнд включает в себя егоже
...
и еще ненаколись на пробелах
Re: Вопрос к любителям bash-а. 18.02.2008 17:13nektofil Фигушки. Лс еще и **сортирует**. В любом случае.
Может сортировать по разным ключам, но сортирует
**всегда**.
Re: Вопрос к любителям bash-а. 18.02.2008 18:08smaharbA ls -1f
Re: Вопрос к любителям bash-а. 18.02.2008 18:15nektofil Делаем простой тест:

---
mkdir megatest
cd megatest
touch {1..100000}
time ls -1f > /dev/null
time find -type f > /dev/null
---

У меня получилось 2.991 и 0.612 секунд соответственно.
Разница заметная.
Re: Вопрос к любителям bash-а. 18.02.2008 18:31smaharbA real 0m0.031s
user 0m0.009s
sys 0m0.022s

real 0m0.026s
user 0m0.006s
sys 0m0.020s

разница есть, да в пользу файнда ))
Re: Вопрос к любителям bash-а. 18.02.2008 20:16kosmonavt >время на 100000 входных данных

если минимум искать в awk (без сортировки), время еще упадет.
---
awk -v t=$TARG '
{ x = t < $0 ? $0 - t : t - $0 }
k > x || NR == 1 { k = x; s = $0 }
END {print k,s}'
---
Re: Вопрос к любителям bash-а. 18.02.2008 20:43nektofil До этого я уже тоже додумался. Улыбка
Но все-равно СПАСИБО!
RSS-материал