find nie działa na dowiązaniu symbolicznym?


15

Jeśli uruchomię to polecenie, find $HOME/MySymlinkedPath -name "run*.sh"nic się nie stanie i nie spowoduje błędu („MySymlinkedPath” to dowiązanie symboliczne do innego dysku twardego innego niż mój $ HOME).

Te również się nie udają:

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

I żeby się upewnić, ta nieistniejąca ścieżka zawodzi (oczywiście), find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"więc ścieżka jest odnajdywana (ponieważ ten błąd się nie zdarza), ale findnie wykonuje na niej wyszukiwania, a ja jestem teraz dość nieświadomy.

Działa to tylko wtedy, gdy cd $HOME/MySymlinkedPathnajpierw usunę takie odwołanie do ścieżki, find -name "run*.sh"ale to nie jest dobre dla moich skryptów.

Dodatkowa informacja :
to polecenie działa jak zwykle ls $HOME/MySymlinkedPath/run*.sh, a jeśli pójdę tam cd $HOME/MySymlinkedPathi uruchomię to, ls ..wynik nie jest tym, czego się spodziewałem - lista ścieżki, na której znajduje się ścieżka dowiązana symbolicznie - zwraca listę prawdziwej ścieżki na inny nośnik / dysk twardy !!!

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

Re-myślenie :
Czy ten problem findi lsczy z moim systemem? czy jest to oczekiwane i wcale nie stanowi problemu? Jestem na Ubuntu 12.10. Nie działa na wszystkich testowanych terminalach, więc nie wydaje się „problemem” terminala.


1
Znalazłem lepszą odpowiedź „znajdź-obserwuj”. stackoverflow.com/questions/105212/…
Jarod

@ Strona podręcznika Jarod mówi, że -follow jest przestarzałe i powinniśmy używać -L (czyli także -follow), jak w mojej odpowiedzi poniżej:>
Aquarius Power

Odpowiedzi:


20

Oto odpowiedź. Ale to pytanie wskazuje na bash jako cel problemu.

Wyjaśnienie jest, że findznaleziska "$HOME/MySymlinkedPath". To dowiązanie symboliczne, a nie katalog, więc rekurencyjne zejście się na tym kończy. Jeśli wyrażenie pasuje "$HOME/MySymlinkedPath"(na przykład in find "$HOME/MySymlinkedPath" -name 'My*'), findwydrukuje to jako dopasowanie.

Jak wskazałem tam, stwierdziłem, że najłatwiejszym / najczystszym sposobem radzenia sobie z tym i naprawy wszystkich skryptów jest zamiast:

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

wystarczy dodać ukośnik, aby findnie zaczynał się od dowiązania symbolicznego, ale od celu dowiązania symbolicznego:

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

Możesz też przekazać -Hopcję find(zwróć uwagę, że musi ona być na pierwszym miejscu, przed ścieżkami), aby kazać jej przechodzić przez dowiązania symboliczne przekazane w wierszu polecenia. (Różni się to od tego, -Lktóry każe findprzechodzić dowiązania symboliczne napotkane również podczas rekurencyjnego opadania).

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

I wreszcie działało to najlepiej tutaj -L(ze względu na kilka systemów plików, które dowiązałem symbolicznie przez foldery). Ale generuje mnóstwo nieproblemowych komunikatów o błędach, więc dodałem 2>/dev/null; i postanowił również utworzyć ten alias alias find='find -L':

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

2
IMHO, ogólnie dobrą praktyką jest używanie ukośnika po katalogach, aby wskazać, że są to katalogi. :) Sprawia, że ​​rzeczy
stają się
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.