знайти не працює на пов'язаному шляху?


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 ..результат не є тим, чого я очікував - список шляху, де знаходиться символічний шлях - повертає список реального шляху на інший медіа / harddrive !!!

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

Переосмислення :
Це проблема з моєю системою findта lsчи з моєю системою? або це очікується і зовсім не проблема ?? Я на Ubuntu 12.10. Він виходить з ладу на всіх тестованих терміналах, тому не здається "проблемою" терміналу.


1
Я знайшов кращу відповідь "знайти-далі". stackoverflow.com/questions/105212/…
Ярод

Сторінка @Jarod man говорить про те, що наступна застаріла, і ми повинні використовувати -L (це також - наступне), як у моїй відповіді нижче:>
Power Aquarius

Відповіді:


20

Ось відповідь. Але це питання вказує на удари як ціль проблеми.

Пояснення тому, що findзнаходить "$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

2
IMHO, загалом є хорошою практикою використовувати проміжну косу рису після каталогів, щоб вказати, що вони насправді є каталогами. :) Робить речі читабельнішими тощо
dannysauer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.