URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7856
[ Назад ]

Исходное сообщение
"как найти файлы изменяемые (созданные) за последний час"

Отправлено nastr , 25-Янв-09 19:37 
Установлена ОС Solaris. Как выяснилось в ней достаточно урезанная функциональность командной оболочки.
Мне нужно найти файлы изменяемые (созданные) за последний час, но в Solaris у команды find есть только ключ -mtime, то есть я могу найти только файлы за последний день. По этому я их сортирую в порядке убывания, что бы последним обрабатывался самый новый файл.
find ./ -mtime -1 -name "CHRIS*" | xargs ls -rt | while read file
Вопрос:
Можно ли каким либо ещё способом найти файлы изменяемые за последний час?

Содержание

Сообщения в этом обсуждении
"как найти файлы изменяемые (созданные) за последний час"
Отправлено vic , 25-Янв-09 23:00 
>Установлена ОС Solaris. Как выяснилось в ней достаточно урезанная функциональность командной оболочки.

Не так. Там просто по умолчанию используется sh, а не bash. А sh имеет сам по себе меньшую функциональность. Так же стандартные утилиты имеют меньшее количество опций чем гнушные.
Однако туда можно доустановить нужные гнушные или просто поискать альтернативные утилиты в других путях таких как /usr/xpg4/bin.


>Мне нужно найти файлы изменяемые (созданные) за последний час, но в Solaris
>у команды find есть только ключ -mtime,

однако ключ -cmin утилиты find есть и в солярке, если вот этот ман https://www.opennet.ru/man.shtml?topic=find&category=1&russian=4 не врет :)


"как найти файлы изменяемые (созданные) за последний час"
Отправлено nastr , 26-Янв-09 12:16 
>Не так. Там просто по умолчанию используется sh, а не bash. А
>sh имеет сам по себе меньшую функциональность. Так же стандартные утилиты
>имеют меньшее количество опций чем гнушные.
>Однако туда можно доустановить нужные гнушные или просто поискать альтернативные утилиты в
>других путях таких как /usr/xpg4/bin.

Доустановка какого либо софта исключена!
На серваке установлены следующие оболочки:
bash; zsh; tcsh; pfcsh; csh; sh; pfsh; jsh; rksh; pfksh; ksh
Но как показала практика, при переходе в другую командную оболочку, у команды find не появляются дополнительные ключи.
>однако ключ -cmin утилиты find есть и в солярке, если вот этот
>ман https://www.opennet.ru/man.shtml?topic=find&category=1&russian=4 не врет :)

по сему могу предположить что MAN - https://www.opennet.ru/man.shtml?topic=find&category=1&russian=4 не соответствует действительности. В подтверждение могу выложить "man find" из SunOS 5.8 (не выкладываю сейчас по причине достаточно большого размера).


"как найти файлы изменяемые (созданные) за последний час"
Отправлено vic , 26-Янв-09 13:24 
>[оверквотинг удален]
>>sh имеет сам по себе меньшую функциональность. Так же стандартные утилиты
>>имеют меньшее количество опций чем гнушные.
>>Однако туда можно доустановить нужные гнушные или просто поискать альтернативные утилиты в
>>других путях таких как /usr/xpg4/bin.
>
>Доустановка какого либо софта исключена!
>На серваке установлены следующие оболочки:
>bash; zsh; tcsh; pfcsh; csh; sh; pfsh; jsh; rksh; pfksh; ksh
>Но как показала практика, при переходе в другую командную оболочку, у команды
>find не появляются дополнительные ключи.

есс-но, find никак не связан с оболочкой, это отдельная утилита.
так же как возможно использование предпочитаемой оболочки - так же возможно использование и предпочитаемой утилиты find.

>>однако ключ -cmin утилиты find есть и в солярке, если вот этот
>>ман https://www.opennet.ru/man.shtml?topic=find&category=1&russian=4 не врет :)
>
>по сему могу предположить что MAN - https://www.opennet.ru/man.shtml?topic=find&category=1&russian=4 не соответствует действительности. В
>подтверждение могу выложить "man find" из SunOS 5.8 (не выкладываю сейчас
>по причине достаточно большого размера).

попробуйте /usr/xpg4/bin/find или еще какой-нить find если дефолтовый не поддерживает -cmin (что странно).

Сколько всего у вас find утилит?)
find / -name find


"как найти файлы изменяемые (созданные) за последний час"
Отправлено nastr , 26-Янв-09 16:10 
Все find в системе одинаковые, c -cmin не работают.
# find / -name find
/usr/bin/find
/usr/xpg4/bin/find
# ls -lF /usr/bin/find
-r-xr-xr-x   1 root     bin        20040 Jul 28  2001 /usr/bin/find*
# ls -lF /usr/xpg4/bin/find
-r-xr-xr-x   1 root     bin        20040 Jul 28  2001 /usr/xpg4/bin/find*

В солярке у touch нет ключа -d..
touch: illegal option -- d


"как найти файлы изменяемые (созданные) за последний час"
Отправлено vic , 27-Янв-09 02:03 
>[оверквотинг удален]
>-r-xr-xr-x   1 root     bin  
>     20040 Jul 28  2001 /usr/bin/find*
>
># ls -lF /usr/xpg4/bin/find
>-r-xr-xr-x   1 root     bin  
>     20040 Jul 28  2001 /usr/xpg4/bin/find*
>
>
>В солярке у touch нет ключа -d..
>touch: illegal option -- d

мдя, не легкий случай, но бывало и хуже ;)
установка чего либо в _свой_ домашний путь тоже исключена?


"О! Дас ист настойашчий уникс фантастиш!"
Отправлено Andrey Mitrofanov , 26-Янв-09 13:34 
>Но как показала практика, при переходе в другую командную оболочку, у команды
>find не появляются дополнительные ключи.

Деццкий сааад!!

TIMESTAMP="`tempfile`"
touch -d "-1 hour" "$TIMESTAMP"
find .... ... ... -newer "$TIMESTAMP" ... ... ...
rm "$TIMESTAMP"

Пилите http:/openforum/vsluhforumID9/7769.html#9 штандард http:/openforum/vsluhforumID9/7769.html#6 POSIX http:/openforum/vsluhforumID3/46819.html#5


"О! Дас ист настойашчий уникс фантастиш!"
Отправлено 0dmin , 26-Янв-09 19:58 
>Деццкий сааад!!

И хто бы пел то! :)


>TIMESTAMP="`tempfile`"
>touch -d "-1 hour" "$TIMESTAMP"
>find .... ... ... -newer "$TIMESTAMP" ... ... ...
>rm "$TIMESTAMP"

Маладец! Осталось только добавить что touch -d - махровый линуксизм и можно сойти за взрослого ,)
touch -t более менее универсален но не понимает relative times - так что строчку готовить в ручную :)

Аффтору топика - у самого полк 5.6(!!!) в продакшене - сам офигиваю до чего отцы были сильны духом! :-)


"global description"
Отправлено nastr , 27-Янв-09 11:16 
Я постараюсь обрисовать Вам что должен делать этот скрипт.
Дважды в день в определённой папке создаются файлы именуемые как NAME_`date "+%m%d%H%M"`\.txt
После этого они передаются на обработку данному скрипту.
Вопрос в том как обращаться (как найти) к этим файлам..
Есть 3 варианта:
1). Обращаться к файлам по имени:
1.1. NAME_`date "+%m%d%H%M"`\.txt – не подходит ведь скрипт может быть запущен на минуту  позже чем был создан файл.
1.2. NAME_`date "+%m%d%H"`*\.txt - не подходит потому что файлы могут появиться в 9:59, а сам скрипт быть запущенным в 10.
1.3. NAME_`date "+%m%d"`*\.txt - не подходит, т.к. получаются все файлы за день, а они создаются дважды на день.
1.4 Вполне достойным вариантом мне кажется следующая конструкция:
H=`date "+%H"`
H1=`echo $H - 1 | bc`; H1=sprintf("%02i",$H1)
if [ -e NAME_`date "+%m%d%H"`*\.txt ]
    then
        grep -v error\#: NAME_`date "+%m%d$H"`*\.txt > 1.txt
    else
        grep -v error\#: NAME_`date "+%m%d$H1"`*\.txt > 1.txt
fi
То есть мне нужно представить часы (%H) как две цифры, в случае если получится 9, чтобы интерпретатор представил как – 09.
Но я не могу разобраться с синтаксисом sprintf..
Использовать два раза if для проверки не хочется.
2). Сравнить с файлом созданным час назад:
TIMESTAMP="`tempfile`"
touch -d "-1 hour" "$TIMESTAMP"
find ./ -newer "$TIMESTAMP" “NAME*”
rm "$TIMESTAMP"
Не подходит, т.к. в SunOS 5.8 у touch нет ключа -d.
3). Использовать find:
3.1. На мой взгляд, идеальным было бы использовать: find ./ -cmin -60, но в данной SunOS 5.8, у find нет ключа -cmin. (я проверил все утилиты find в системе).
3.2. Остаётся использовать find ./ -mtime -1 -name "NAME*" | xargs ls -rt, для того что б последним обрабатывался самый новый файл использую xargs ls –rt.

"global description"
Отправлено phpcoder , 27-Янв-09 11:32 
>То есть мне нужно представить часы (%H) как две цифры, в случае
>если получится 9, чтобы интерпретатор представил как – 09.
>Но я не могу разобраться с синтаксисом sprintf..

Вы на каком языке пишете, уважаемый? В shell-е нет sprintf, а если бы и был, то вызывался бы он явно не как sprintf()

Вместо

H1=sprintf("%02i",$H1)

попробуйте

H1=`printf '%02i' $H1`


"global description"
Отправлено nastr , 27-Янв-09 12:27 
>Вместо
>
>H1=sprintf("%02i",$H1)
>
>попробуйте
>
>H1=`printf '%02i' $H1`

Спасибо большое, так заработало:
H1=`echo $H - 1 | bc`; H1=`printf '%02i' $H1`



"global description"
Отправлено phpcoder , 27-Янв-09 12:44 
>Спасибо большое, так заработало:
>H1=`echo $H - 1 | bc`; H1=`printf '%02i' $H1`

Зачем использовать bc для декремента переменной? Можно обойтись стандартным expr:

H1=`expr $H - 1`

Также подумайте, что будет если от нуля вы отнимете один? По идее вы должны получить 23 часа, но математически вы получите -1, что неверно для вас.


"Axe Effect отдыхает"
Отправлено Andrey Mitrofanov , 27-Янв-09 11:31 
>Маладец! Осталось только добавить что touch -d - махровый линуксизм и можно
>сойти за взрослого ,)

Спасибо! Я исправлюсь, правда-правла! %) Вот так д.б. вполне позикс-вей:

TIMESTAMP="`tempfile`"
touch "$TIMESTAMP"
sleep 3600
find .... ... ... -newer "$TIMESTAMP" ... ... ...
rm "$TIMESTAMP"

>до чего отцы были сильны духом! :-)

...они _решились_ размножаться... $*)