Почему $ find -delete иногда не работает?

852
NReilingh

Я думаю, что я говорю об этой части справочной страницы, которая для меня едва различима:

 -удалять ... Он не будет пытаться удалить имя файла с символом `` / '' в его путь к ``. '' по соображениям безопасности ...

В частности, я пытаюсь это сделать $ find . -name '.svn' -type d -delete. Я понимаю, что могу использовать -execэто вместо этого, но, findпохоже, работает без проблем для других имен, в том числе глубоко в каталогах (которые, очевидно, содержат много /символов в своих путевых именах).

Возможно, он игнорирует точечные файлы, а документация неверна?

4

1 ответ на вопрос

2
jjlin

«Причина безопасности» заключается в том, что в промежутке между findперечислением файлов и их удалением злоумышленник может изменить один компонент пути к файлу так, что он станет символической ссылкой на неожиданный каталог, что приведет к удалению файл с таким же именем из неожиданного каталога. Например, вы можете в конечном итоге удалить, /etc/passwdа не /tmp/foo/passwdесли злоумышленник может измениться fooна символическую ссылку, указывающую на /etc.

В разделе 9.1.5 («Более безопасная версия -exec») документации по поиску GNU обсуждается эта проблема более подробно.

Это часть «по отношению к.», Которая запутала меня. Я не понимаю, почему я могу удалить файл вроде asdf / somefile.txt, используя -delete относительно моего рабочего каталога, но не asdf / .svn NReilingh 12 лет назад 0
`.` не говорит о точечных файлах, как` .svn`; речь идет о нотации Unix для «текущего каталога» или «рабочего каталога», то есть `.`. В этом контексте я не вижу причины безопасности, чтобы различать точечные файлы и другие файлы. Итак, вы говорите, что ваша команда `find` не работает на` .svn`, но работает на других файлах? Единственная причина, по которой я могу придумать, это то, что `-delete` не работает на непустых каталогах, AFAIK. jjlin 12 лет назад 0
Действительно - вот что смущает насчет этого. Я понимаю, что `.` - это рабочий каталог, но я не понимаю, как man-страница утверждает, что она предназначена для сбоя во ВСЕХ подкаталогах соответствующего рабочего каталога, когда это явно не так. NReilingh 12 лет назад 0
Ах. Тогда вполне может быть так, что man-страница просто устарела, и с тех пор они внедрили более безопасный `-delete` и сняли это ограничение. У меня нет доступа ни к каким машинам OS X, поэтому я не могу сказать наверняка там. jjlin 12 лет назад 0