|
|
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
В Linux полное мясо, работаю с Oracle. Возникла задача написать скрипт. Смысл в следующем: в директории есть куча файлов с расширениями bdy и spc, кол-во с bdy=кол-во с spc. Необходимо пробежаться по всем файлам в директории и запустить утилиту wrap (враппит содержание программы), параметры для запуска такие: wrap iname={$имя_файла} oname=w_{$имя_файла} (например так, т.е. w_ добавить к названию файла). Только вот не догнал я еще пока как все это сделать, простые циклы по числам это я писал, но вот с файлами еще не работал. Подскажите, пожалуйста, куда копать, сильно надо. Я думаю, мне хватит простого цикла по всем файлам в директории, типа: for [файлы в директории], только вот надо понять, по чему for будет, и как взять имя файла, это я не догнал, торможу еще с утра... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 08:10:09 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
Блин, кажись что-то наколбасил, вроде заработало: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 08:24:02 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
Буть проще Код: plaintext 1. 2. 3. 4. 5. There Ain't No Such Thing As A Free Lunch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 20:49:07 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
Обратите внимание на команды find и xargs. Просто примерчик: find /xxxx/yyy/zzz -type f -name '*.arc' -mtime +1 -print | xargs gzip -f -d В вашем случае кстати можно примерно так: find DIRECTORY -type f -exec wrap iname='{}' oname=w_'{}' ';' и даже скрипта писать не надо будет -:) SeaGateВ Linux полное мясо, работаю с Oracle. Возникла задача написать скрипт. Смысл в следующем: в директории есть куча файлов с расширениями bdy и spc, кол-во с bdy=кол-во с spc. Необходимо пробежаться по всем файлам в директории и запустить утилиту wrap (враппит содержание программы), параметры для запуска такие: wrap iname={$имя_файла} oname=w_{$имя_файла} (например так, т.е. w_ добавить к названию файла). Только вот не догнал я еще пока как все это сделать, простые циклы по числам это я писал, но вот с файлами еще не работал. Подскажите, пожалуйста, куда копать, сильно надо. Я думаю, мне хватит простого цикла по всем файлам в директории, типа: for [файлы в директории], только вот надо понять, по чему for будет, и как взять имя файла, это я не догнал, торможу еще с утра... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2006, 02:51:01 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
С файлами не налетите на грабли с длиной строки аргументов (это не в вашем примере, но все таки). Неправильно: gzip /opt/oracle/admin/DB/*.tpc Правильнее (немного) cd /opt/oracle/admin/DB/ || exit 1 for i in *.tpc do gzip -f $i done (-f потому что мог остаться файл от недоделанного прошлого раза). Еше правильнее find /opt/oracle/admin/DB/ -type f -name '*.tpc' -print | xargs gzip -f Разница в том, что в первом случае формируется строка аргументов. Она имеет ограничение - 5 Кб (с небольшим хвостиком). В итоге часто выходит, что на тестах все работает, потом работает под небольшой нагрузкой, потом в какой то момент файлов становитс много, скрипт ломается - и все заклинивается пока не прибежит взмыленный админ выяснять, почему у него место кончилось. Во втором - в конструкии for i in ограничения в ШЕЛЛЕ нету. В третьем - find выдаст список файлов, а xargs сам их сгруппирует так, что при каждом вызове будет максимально возможное количество аргументов, не превышвающее ограничение. Еще обращаю внимание на мелочи типа -f - что будет если скрипт запустился, а сервер перевызвали - то есть остался недоделанный выходной файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2006, 02:56:12 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
[quot BlackStar]Буть проще Код: plaintext 1. 2. 3. 4. 5. Ваш скрипт делает правильно, но результат пишет в ТЕКУЩИЙ каталог. Кстати, у меня там в find такая же ошибка вышла (в oname будут имена типа w_/u02/... что неверно) - лучше делать не w_файл а файл.W, и вот тогда все получается без всяких там basename. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2006, 02:58:24 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
По мотивам автора: ls никогда не делайте. Либо * либо find. Ваш скрипт будет выглядеть так: (суффиксы я домыслил) cd /u02/wrap || exit 1 for f in *.bnc *.syp do wrap iname=$f oname=$f.W done ВОт это можно запускать МНОГО РАЗ, и оно не запустит рекурсивно ваш wrap. Оно же не зависит от формата вывода ls, который никто вам вообще не гарантировал. Ну а если нужно w_ позарез, тогда так: #!/bin/sh cd /u02/wrap || exit 1 mkdir -p WRAPPED for i in * do test -f $i && wrap if=$i of=WRAP/w_$i done Так что не все так просто - я этой лапши с ls и awk поубивал уже (в дата центре, блин) просто немерянно.. Тоже кто то думал, что _все так просто_. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2006, 03:03:51 |
|
||
|
bash-scripting (надо написать скрипт)
|
|||
|---|---|---|---|
|
#18+
Здорово, буду пробовать! Про ls и awk - это да, очень вымученный вариант (все от незнания *NIX систем, т.к. на работе заставляют сидеть на винде :(), буду учить команды дальше. Спасибо всем за внимание! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2006, 08:44:45 |
|
||
|
|

start [/forum/topic.php?fid=25&msg=33721754&tid=1489503]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 308ms |

| 0 / 0 |
