find не работает по символическим ссылкам?

find не работает по символическим ссылкам?

Если я запускаю эту команду, find $HOME/MySymlinkedPath -name "run*.sh"ничего не происходит и не выдает никаких ошибок («MySymlinkedPath» — это символическая ссылка на другой жесткий диск, отличный от моего $HOME).

Это также не срабатывает:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

И просто для уверенности, этот несуществующий путь не выполняется (конечно же), find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"поэтому путь находится (потому что этой ошибки не происходит), но findпоиск по нему не выполняется, и теперь я совершенно ничего не понимаю.

Это сработает только если я cd $HOME/MySymlinkedPathсначала удалю ссылку на путь, как здесь, find -name "run*.sh"но это нехорошо для моих скриптов.

Дополнительная информация:
эта команда работает как обычно ls $HOME/MySymlinkedPath/run*.sh, и если я перейду туда cd $HOME/MySymlinkedPathи запущу ее, ls ..результат будет не таким, как я ожидал — список путей, где находится символическая ссылка, — она возвращает список реальных путей на другом носителе/жестком диске!!!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

Переосмысление:
Это проблема с findи lsили с моей системой? или это ожидаемо и не проблема вообще?? Я на Ubuntu 12.10. Это не работает на всех терминалах, которые я тестировал, так что это не похоже на "проблему" терминала.

решение1

Здесьвот ответ. Но этот вопрос указывает на bash как на цель проблемы.

Объяснение в том, что findfinds "$HOME/MySymlinkedPath". Это символическая ссылка, а не каталог, поэтому рекурсивный спуск останавливается на этом. Если выражение совпало "$HOME/MySymlinkedPath"(например, в find "$HOME/MySymlinkedPath" -name 'My*'), то findвыведет это как совпадение.

Как там указано, я обнаружил, что самый простой/чистый способ справиться с этим и исправить все скрипты — это вместо:

find "$HOME/MySymlinkedPath" -name "run*.sh"

просто добавьте слеш, чтобы он findначинался не с символической ссылки, а с цели символической ссылки:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

В качестве альтернативы передайте -Hпараметр find(обратите внимание, что он должен быть первым, перед путями), чтобы указать ему переходить по символическим ссылкам, переданным в командной строке. (Это отличается от -Lтого, который также указывает findна необходимость переходить по символическим ссылкам, встречающимся во время рекурсивного спуска.)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

И, наконец, это сработало лучше всего здесь -L(из-за нескольких файловых систем, которые я симлинковал через папки). Но это генерирует кучу непроблемных сообщений об ошибках, поэтому я добавил 2>/dev/null; и также решил создать этот псевдоним alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

Связанный контент