Баг в программе FIND ?

Модератор: Модераторы разделов

DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Баг в программе FIND ?

Сообщение DJon »

Кажется я нашел баг программы "find"...
Посмотрите листинги и скажите почему в одном случае программ работает коректно, а в другом нет. Может это баг?
О программе: Программа ищет в созданных её самой под дирикториях определенный файл и в одном случае удаляет папку с этим файлом, а в другом перемещает.
О баге: При удалении все работает нормально - оба файла с их папками удаляются, а при перемещении - один файл вместе со своей директорией перемещается а другой файл остается на месте!

ЗЫ Вариант (удаление или перемещание) необходимо поставить ручками ;)

Листинг файла "find.sh"

Код: Выделить всё

#!/bin/sh

rm -R ./Test                            #Удаляю результаты предыдущей работы

mkdir  ./Test
mkdir  ./Test/Dir                        #Создаю иерархию папок и файлов для проверки
mkdir  ./Test/Dir/Dir1                        #бага. Мне нужны две директории и два файла
echo > ./Test/Dir/Dir1/MyFile
mkdir  ./Test/Dir/Dir2
echo > ./Test/Dir/Dir2/MyFile

find ./Test -type "f" -name "MyFile" -exec ./del.sh {}  \;    #Запускаю поиск файлов "MyFile" с последующим запуском сценария


Листинг файла "del.sh"

Код: Выделить всё

#!/bin/sh

FilePath="$1"            #Путь к файлу
DirPath="${FilePath%/*}"    #Получаю путь к директории, где лежит файл

#РАСКОМЕНТИРУЙТЕ ОДНУ ИЗ ДВУХ СТРОК ДЛЯ ПРОВЕРКИ БАГА
#rm -R $DirPath                #при использовании этой строки - баг НЕ возникает. Обе директории, содержащие файл удаляются
#mv "$DirPath" "$DirPath/../../"    #при использовании этой - баг возникает. Одна директория переносится в директорию повыше, а другая остается на прежнем месте!!!


Тоже самое прикрепил...
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Баг в программе FIND ?

Сообщение Uncle_Theodore »

А он тебе вот так не говорит?

Код: Выделить всё

find: ./.. changed during execution of find

:)
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

Нет. А у тя это говорит? :blink:
При втором варианте он говорит:
find: ./Test/Dir/Dir2: No such file or directory

Хотя именно эта директория и остается не тронутой!!! Но почему он ее найти не может, я не могу понять. :(
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Баг в программе FIND ?

Сообщение serzh-z »

Замена "#mv "$DirPath" "$DirPath/../../"" на "echo mv "$DirPath" "$DirPath/../../"" очень помогут в диагностике.
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

Замена "#mv "$DirPath" "$DirPath/../../"" на "echo mv "$DirPath" "$DirPath/../../"" очень помогут в диагностике.

Гм.... Наколько я знаю bash, то эта фраза приведет к выводу на экран всего что идет за "echo". тоесть на экран выйдет следующее:

Код: Выделить всё

mv "$DirPath" "$DirPath/../../"

Как это может мне помочь? :blink:


Ну вот...и bash со мной согласен... :)
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Баг в программе FIND ?

Сообщение serzh-z »

DJon
Это поможет увидеть реальную строку перемещения, с реальными путями, которые передаются mv.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Баг в программе FIND ?

Сообщение Uncle_Theodore »

serzh-z писал(а):
02.04.2007 23:24
DJon
Это поможет увидеть реальную строку перемещения, с реальными путями, которые передаются mv.

Что забавно, там ничего криминального нет.

Код: Выделить всё

 cat del.sh
#!/bin/sh

FilePath="$1"
DirPath="${FilePath%/*}"
pwd
echo mv "$DirPath" "$DirPath/../../"
pwd


после чего

Код: Выделить всё

find ./Test -type "f" -name "MyFile" -exec ./del.sh {}  \;

выводит

Код: Выделить всё

/home/teddy
mv ./Test/Dir/Dir1 ./Test/Dir/Dir1/../../
/home/teddy
/home/teddy
mv ./Test/Dir/Dir2 ./Test/Dir/Dir2/../../
/home/teddy


А вот про ошибку ("find сменил директорию") можно много нагуглить... :)
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

Это поможет увидеть реальную строку перемещения, с реальными путями, которые передаются mv.

В том то и трабла, что все пути я уже перепроверил на сто раз. Перепроверел текущую директорию и многое другое... и в конце то концов, копирование и удаление с теми же параметрами работают, а перемещение нет!

А вот про ошибку ("find сменил директорию") можно много нагуглить...

Я ничего путнего не нашел :( Да и к томуже. В каком месте он мог сменить директорию? Все уже просмотрел... :(
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Баг в программе FIND ?

Сообщение Uncle_Theodore »

DJon писал(а):
02.04.2007 23:51
и в конце то концов, копирование и удаление с теми же параметрами работают, а перемещение нет!

Ага!

Вот смотри

Код: Выделить всё

 cat del.sh
#!/bin/sh

FilePath="$1"
DirPath="${FilePath%/*}"
pwd
mv "$DirPath" "$DirPath/../../"
pwd

Вот теперь трабла:

Код: Выделить всё

 find ./Test -type "f" -name "MyFile" -exec ./del.sh {}  \;
/home/teddy
/home/teddy
find: ./Test/Dir/Dir2: No such file or directory
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

Ага!

Вот смотри ...

я про эту ошибку в третьем посте написал....
Присмотрись внимательнее
/home/teddy и ./Test/Dir/Dir2 --- Ведь есть такая директория куда он обращается? Верно? Тогда почему find говорит что её нет?
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Баг в программе FIND ?

Сообщение Uncle_Theodore »

DJon писал(а):
03.04.2007 00:04
Ага!

Вот смотри ...

я про эту ошибку в третьем посте написал....
Присмотрись внимательнее
/home/teddy и ./Test/Dir/Dir2 --- Ведь есть такая директория куда он обращается? Верно? Тогда почему find говорит что её нет?

Не-а. :) Очевидно, что там, где find в данный момент находится, ./Test/Dir/Dir2 почему-то нету... Именно в текущей директории Test'а-то и нету. Потому что find за каким-то чертом директорию сменил...

По крайней мере, я так думаю.
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

Не-а. Очевидно, что там, где find в данный момент находится, ./Test/Dir/Dir2 почему-то нету... Именно в текущей директории Test'а-то и нету. Потому что find за каким-то чертом директорию сменил...

По крайней мере, я так думаю.

Я пробовал вручную ставить "cd" чуть ли не на всю иерархию папок (поочереди :) )
Видимо, то где он находится - это независимый от пользователя фактор :( причем ТОЛЬКО при "mv"

ЗНАЧИТ ЭТО БАГ!!! :(
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Баг в программе FIND ?

Сообщение sash-kan »

DJon
громко, конечно, сказано - баг в программе.
вообще-то не зря даже опция такая придумана - -ignore_readdir_race.
служащая для подавления сообщения об ошибке, если на ходу изменяются каталоги, с которыми find в это время работает.
если хочешь, чтобы перемещение все-таки отработало, а не обрывалось find-ом при обнаружении изменений в каталогах, делай перемещение _после_ получения списка файлов. и ты не выбьешь стул прямо из-под ног работающего find-а. и он не вывалится с сообщением о таком безобразии.
просто замени
find ./Test -type "f" -name "MyFile" -exec ./del.sh {} \;
на
find ./Test -type "f" -name "MyFile" | xargs -n 1 ./del.s

p.s. скорее к категории багов относится желание поставить подножку выполняемой программе. и что ей, спрашивается, остается делать после подножки? правильно - сообщить об ошибке.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Баг в программе FIND ?

Сообщение v04bvs »

sash-kan писал(а):
03.04.2007 13:16
DJon
громко, конечно, сказано - баг в программе.
вообще-то не зря даже опция такая придумана - -ignore_readdir_race.
служащая для подавления сообщения об ошибке, если на ходу изменяются каталоги, с которыми find в это время работает.
если хочешь, чтобы перемещение все-таки отработало, а не обрывалось find-ом при обнаружении изменений в каталогах, делай перемещение _после_ получения списка файлов. и ты не выбьешь стул прямо из-под ног работающего find-а. и он не вывалится с сообщением о таком безобразии.
просто замени
find ./Test -type "f" -name "MyFile" -exec ./del.sh {} \;
на
find ./Test -type "f" -name "MyFile" | xargs -n 1 ./del.s

p.s. скорее к категории багов относится желание поставить подножку выполняемой программе. и что ей, спрашивается, остается делать после подножки? правильно - сообщить об ошибке.

Тем не менее баг есть, как минимум в том, что сообщение об ошибке неверное. А я подозреваю, что причина может быть глубже. Поэтому, багрепорт отправлять надо.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Баг в программе FIND ?

Сообщение Uncle_Theodore »

v04bvs писал(а):
03.04.2007 14:26
Тем не менее баг есть, как минимум в том, что сообщение об ошибке неверное. А я подозреваю, что причина может быть глубже. Поэтому, багрепорт отправлять надо.

Про это уже много говорили большевики
http://www.google.com/search?hl=en&q=f...G=Google+Search
Но если хочешь, отпавь, конечно...
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

громко, конечно, сказано - баг в программе.
вообще-то не зря даже опция такая придумана - -ignore_readdir_race.
служащая для подавления сообщения об ошибке, если на ходу изменяются каталоги, с которыми find в это время работает.

А ты сам попробуй эту опцию ;) У меня она подавила сообщения при попытке войти в каталог, доступ к которому запрещен. А к этой проблеме, это опция паралельна...

если хочешь, чтобы перемещение все-таки отработало, а не обрывалось find-ом при обнаружении изменений в каталогах, делай перемещение _после_ получения списка файлов. и ты не выбьешь стул прямо из-под ног работающего find-а. и он не вывалится с сообщением о таком безобразии.

А если структура настолько велика и часто меняется, что обратившись к перемещению в конце сканирования, мы вообще не найдем этот файл?!

p.s. скорее к категории багов относится желание поставить подножку выполняемой программе. и что ей, спрашивается, остается делать после подножки? правильно - сообщить об ошибке.

Значит с подножкой "rm" она справляется, а "mv" ей не по зубам?! Странно...это-ли не есть баг?
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Баг в программе FIND ?

Сообщение serzh-z »

(DJon @ Apr 3 2007, в 22:14) писал(а):А если структура настолько велика и часто меняется
Если она настолько часто меняется, то лучше использовать inotify.
Спасибо сказали:
DJon
Сообщения: 76
ОС: OpenSUSE 10.3

Re: Баг в программе FIND ?

Сообщение DJon »

Если она настолько часто меняется, то лучше использовать inotify.

Думаю так глубоко копать мне не надо....буду юзать связку "cp"+"rm" вместо "mv"...
Всем спасибо.
СисАдмин - это, в первую очередь, "творческая личность" и только потом "пьяная скотина" ...
Спасибо сказали: