найти не работает по символической дорожке?


15

Если я запускаю эту команду, 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
Я нашел лучший ответ "найти-следовать". stackoverflow.com/questions/105212/…
Джарод

Страница руководства @Jarod гласит: -follow устарела, и мы должны использовать -L (это также --follow), как указано в моем ответе ниже:>
Aquarius Power

Ответы:


20

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

Объяснение тому, что findнаходит "$HOME/MySymlinkedPath". Это символическая ссылка, а не каталог, поэтому рекурсивный спуск на этом останавливается. Если выражение соответствует "$HOME/MySymlinkedPath"(например, in 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

2
ИМХО, как правило, рекомендуется использовать косую черту после каталогов, чтобы указать, что они на самом деле являются каталогами. :) Делает вещи более читабельными и т. Д.
dannysauer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.