Если я запускаю эту команду, 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 как на цель проблемы.
Объяснение в том, что find
finds "$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