LINUX.ORG.RU

из find dir -exec почему-то не работает test -d, -f и т.п


0

0

Бился весь, день, бошку поломал, понять не могу почему.

Вот примеры:

find . -exec echo chmod a`[ -f {} ] && echo + || echo -`x {} \;

всегда дает chmod a-x, хотя

find . -exec echo chmod a`[ 1 = 1 ] && echo + || echo -`x {} \;

дает chmod a+x, а

find . -exec echo chmod a`[ 1 = 0 ] && echo + || echo -`x {} \;

дает chmod a-x, как и положено. В чем косяк?

PS. echo добавил, чтоп не получилось у вас как с тем однострочником на перле :)


Ответ на: комментарий от sdio

гы-гы ;)))
find . -type d -exec chmod a-x {} \; -o -type f -exec chmod a+x {} \;

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

Да сделать можно сотней способов, не вопрос, дело не в том как добиться результата.
Вопрос в том, почему не работает `test -{d|f...}`, вот меня что интересует.

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

>Кто тебе сказал, что find запускает shell для исполнения -exec команд?

Ну строго говоря никто не говорил, однако конструкции вида
find . -exec echo `echo {}` \;

и даже
find . -exec echo '`echo {}`' \;

нормально работают.

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

Не работает! Тебе показалось.
Точнее оно (`echo {}`) срабатывает один раз до запуска find, а не при каждом -exec.

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

Показалось? Я же специально второй вариант написал, в котором `` закрыты ''. Ты перед тем как писать хоть проверил бы чтоль.

[sergio@az 1]$ mkdir test_dir
[sergio@az 1]$ touch test_file
[sergio@az 1]$ find . -exec echo '`echo {}`' \;
`echo .`
`echo ./test_dir`
`echo ./test_file`
[sergio@az 1]$ find . -exec echo `echo {}` \;
.
./test_dir
./test_file


т.е. expansion делает-таки не один раз, а каждый раз. И каждый раз {} find заменяет на то, что надо.

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

Еще интересней:

[sergio@az 1]$ find . -exec echo `file {}` \;
.: Can't stat `.' (No such file or directory)
./test_dir: Can't stat `./test_dir' (No such file or directory)
./test_file: Can't stat `./test_file' (No such file or directory)
[sergio@az 1]$ find $PWD -exec echo `file {}` \;
/home/sergio/1: Can't stat `/home/sergio/1' (No such file or directory)
/home/sergio/1/test_dir: Can't stat `/home/sergio/1/test_dir' (No such file or directory)
/home/sergio/1/test_file: Can't stat `/home/sergio/1/test_file' (No such file or directory)

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

соотвественно дело не test, а в find -exec.

ЗЫ.
[sergio@az 1]$ ll
итого 4
drwxrwxr-x 2 sergio sergio 4096 Янв 13 15:52 test_dir
-rw-rw-r-- 1 sergio sergio 0 Янв 13 15:53 test_file

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

Ты так ничего и не понял.


find . -exec echo `echo {}` \; 
перед запуском преобразуется в 
find . -exec echo {} \;  и все тебе кажется красивым

find . -exec echo `file {}` \; 
Это раскрывается до
find . -exec echo {}: ERROR: cannot open `{}' (No such file or directory) \;
И ты получаешь то что ты привел в своем посте.

P.S. Ладно, кто-нибудь другой тебе объяснит.

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