Установлена ОС Solaris. Как выяснилось в ней достаточно урезанная функциональность командной оболочки.
Мне нужно найти файлы изменяемые (созданные) за последний час, но в Solaris у команды find есть только ключ -mtime, то есть я могу найти только файлы за последний день. По этому я их сортирую в порядке убывания, что бы последним обрабатывался самый новый файл.
find ./ -mtime -1 -name "CHRIS*" | xargs ls -rt | while read file
Вопрос:
Можно ли каким либо ещё способом найти файлы изменяемые за последний час?
>Установлена ОС Solaris. Как выяснилось в ней достаточно урезанная функциональность командной оболочки.Не так. Там просто по умолчанию используется sh, а не bash. А sh имеет сам по себе меньшую функциональность. Так же стандартные утилиты имеют меньшее количество опций чем гнушные.
Однако туда можно доустановить нужные гнушные или просто поискать альтернативные утилиты в других путях таких как /usr/xpg4/bin.
>Мне нужно найти файлы изменяемые (созданные) за последний час, но в Solaris
>у команды find есть только ключ -mtime,однако ключ -cmin утилиты find есть и в солярке, если вот этот ман https://www.opennet.ru/man.shtml?topic=find&category=1&russian=4 не врет :)
>Не так. Там просто по умолчанию используется 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 (не выкладываю сейчас по причине достаточно большого размера).
>[оверквотинг удален]
>>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
Все 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
>[оверквотинг удален]
>-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мдя, не легкий случай, но бывало и хуже ;)
установка чего либо в _свой_ домашний путь тоже исключена?
>Но как показала практика, при переходе в другую командную оболочку, у команды
>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
>Деццкий сааад!!И хто бы пел то! :)
>TIMESTAMP="`tempfile`"
>touch -d "-1 hour" "$TIMESTAMP"
>find .... ... ... -newer "$TIMESTAMP" ... ... ...
>rm "$TIMESTAMP"Маладец! Осталось только добавить что touch -d - махровый линуксизм и можно сойти за взрослого ,)
touch -t более менее универсален но не понимает relative times - так что строчку готовить в ручную :)Аффтору топика - у самого полк 5.6(!!!) в продакшене - сам офигиваю до чего отцы были сильны духом! :-)
Я постараюсь обрисовать Вам что должен делать этот скрипт.
Дважды в день в определённой папке создаются файлы именуемые как 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.
>То есть мне нужно представить часы (%H) как две цифры, в случае
>если получится 9, чтобы интерпретатор представил как – 09.
>Но я не могу разобраться с синтаксисом sprintf..Вы на каком языке пишете, уважаемый? В shell-е нет sprintf, а если бы и был, то вызывался бы он явно не как sprintf()
Вместо
H1=sprintf("%02i",$H1)
попробуйте
H1=`printf '%02i' $H1`
>Вместо
>
>H1=sprintf("%02i",$H1)
>
>попробуйте
>
>H1=`printf '%02i' $H1`Спасибо большое, так заработало:
H1=`echo $H - 1 | bc`; H1=`printf '%02i' $H1`
>Спасибо большое, так заработало:
>H1=`echo $H - 1 | bc`; H1=`printf '%02i' $H1`Зачем использовать bc для декремента переменной? Можно обойтись стандартным expr:
H1=`expr $H - 1`
Также подумайте, что будет если от нуля вы отнимете один? По идее вы должны получить 23 часа, но математически вы получите -1, что неверно для вас.
>Маладец! Осталось только добавить что touch -d - махровый линуксизм и можно
>сойти за взрослого ,)Спасибо! Я исправлюсь, правда-правла! %) Вот так д.б. вполне позикс-вей:
TIMESTAMP="`tempfile`"
touch "$TIMESTAMP"
sleep 3600
find .... ... ... -newer "$TIMESTAMP" ... ... ...
rm "$TIMESTAMP">до чего отцы были сильны духом! :-)
...они _решились_ размножаться... $*)