trova non funziona su percorso simbolico?


15

Se find $HOME/MySymlinkedPath -name "run*.sh"eseguo questo comando non accade nulla e non viene visualizzato alcun errore ("MySymlinkedPath" è un percorso collegato a un altro disco rigido diverso da quello $ HOME).

Anche questi falliscono:

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

E solo per essere sicuro, questo percorso inesistente fallisce (ovviamente) find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"quindi il percorso viene trovato (perché quell'errore non si verifica) ma findnon esegue la ricerca su di esso, e ora sono molto all'oscuro.

Funziona solo se cd $HOME/MySymlinkedPathprima rimuovo e rimuovo il riferimento al percorso in questo modo, find -name "run*.sh"ma non è un bene per i miei script.

Ulteriori informazioni :
questo comando funziona come al solito ls $HOME/MySymlinkedPath/run*.sh, e se ci vado cd $HOME/MySymlinkedPathed eseguo questo ls ..il risultato non è quello che mi aspettavo - l'elenco del percorso in cui si trova il percorso con collegamento simbolico - restituisce l'elenco del percorso reale su l'altro media / hard disk !!!

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

Ripensamento :
è un problema con finde ls, o con il mio sistema? o è previsto e non è affatto un problema ?? Sono su Ubuntu 12.10. Non funziona su tutti i terminali che ho testato, quindi non sembra un "problema" del terminale.


1
Ho trovato una risposta migliore "trova-seguire". stackoverflow.com/questions/105212/…
Jarod

La pagina man di @Jarod dice che -segui è deprecato e dovremmo usare -L (che è anche -segui) come nella mia risposta qui sotto:>
Aquarius Power

Risposte:


20

Ecco la risposta Ma questa domanda punta a bash come obiettivo del problema.

La spiegazione è che findtrova "$HOME/MySymlinkedPath". È un collegamento simbolico, non una directory, quindi la discesa ricorsiva si ferma qui. Se l'espressione corrisponde "$HOME/MySymlinkedPath"(ad esempio, in find "$HOME/MySymlinkedPath" -name 'My*'), la findstampa come una corrispondenza.

Come indicato qui, ho scoperto che il modo più semplice / pulito per gestirlo e correggere tutti gli script è, invece di:

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

basta aggiungere una barra, in modo che findnon inizi dal collegamento simbolico ma dalla destinazione del collegamento simbolico:

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

In alternativa, passa l' -Hopzione a find(nota che deve venire prima, prima dei percorsi) per dirgli di attraversare i collegamenti simbolici passati sulla sua riga di comando. (Questo è diverso da quello -Lche dice finddi attraversare anche i collegamenti simbolici incontrati durante la discesa ricorsiva.)

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

E alla fine ha funzionato meglio qui -L(a causa dei vari filesystem che ho collegato tramite cartelle). Ma genera un sacco di messaggi di errore non problematici, quindi ho aggiunto 2>/dev/null; e ho anche deciso di creare questo alias alias find='find -L':

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

2
IMHO, è generalmente buona norma usare una barra finale dopo le directory per indicare che sono effettivamente directory. :) Rende le cose più leggibili, ecc.
dannysauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.