LINUX.ORG.RU

wildcard, ksh, прогулка по файлам, aix

 ,


1

1

Чойта я туплю отчаянно. AIX (ох, сейчас камней будет). ksh. Хочу в скрипте сделать что-то с каждым файлом *.dat в каталоге.

Вариант 1:

for f in /dir/*.dat; do

работает хорошо, если файлы есть. Но если нет - тело цикла вызывается один раз с параметром /dir/*.dat. Приходится внутри делать какое-нибудь глупое if [ -f $f ]

Вариант 2:

ls /dir/*.dat | while read $f; do

тоже работает, но, если файлов нет, ls ругается. Приходится перенаправлять 2>/dev/null, что не очень красиво

Вариант 3:

find /dir -name '*.dat' | while read $f; do

не совсем то, ибо лезет вглубь, а я не хочу (тамошний find не знает про maxdepth).

Как кошерно? Я понимаю, что надо использовать нормальный linux, bash, find и т.д. Но условия в задачке именно такие.

★★★★★

Последнее исправление: svu (всего исправлений: 1)

Могу еще предложить способ для извращенцев:

ls -a | grep '.*\.dat'

Кстати, ты в примере с ls параметр -a забыл, или специально не указал? Потому как твои примеры не эквивалентны: find найдёт всё, что соответствует шаблону, а ls — только имена без точки в начале.

geekless ★★
()
Ответ на: как-то так от beastie

О, клево, -prune...

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

Да, с грепом - это тонко!

И ошибочно: я там $ забыл указать в конце регулярки. :}

geekless ★★
()
Ответ на: комментарий от Deleted

find: 0652-017 -path is not a valid option.

svu ★★★★★
() автор топика
Ответ на: комментарий от beastie

Уймись уже :-)

# find /1/* -prune -type f -name '*.dat' -print
find: 0652-019 The status on /1/* is not valid.

# pwd
/1

# ls -a
.   ..

# oslevel -r
7100-02

anonymous
()
Ответ на: комментарий от anonymous

Ну да, чуть оптимальнее. Но хотел обойтись одним оператором. Вроде бисти добил.

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

Не там ты оптимизируешь. Больше времени потратил уже, чем профит получишь. Уменьшай количество форков в циклах.

anonymous
()
Ответ на: комментарий от anonymous

Я ж чисто теоретически!

svu ★★★★★
() автор топика
Ответ на: комментарий от anonymous

О, спасибо за замечательную ссылку! Покурю ее

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

shopt -s nullglob

Уже поддерживает, с какой версии.. под рукой нема? А то только знаю ~(N) (перед глобом) - но уж лучше if.

anonymous
()
Ответ на: комментарий от svu
find . -name . -o -type d -prune -o -name '*.properties' -print

./ocr.properties

Должно работать на всех юниксах, но хочется за такое Ъ юниксы убивать, сам намучился с find на чпуксах.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от vtVitus

Если хочется по полному пути искать, то надо добавлять точку в конце. т.е.

find /home/xxx/. -name . -o -type d -prune -o -name '*.properties' -print
/home/xxx/./ocr.properties

в общем -prune средство для настоящих мужчин.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

+100500. Убивать за такое.

svu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.