find não funciona no caminho com link simbólico?

find não funciona no caminho com link simbólico?

Se eu executar este comando find $HOME/MySymlinkedPath -name "run*.sh", nada acontece e não ocorre nenhum erro ('MySymlinkedPath' é um caminho com link simbólico para outro disco rígido diferente do meu $HOME).

Estes também falham:

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

E só para ter certeza, esse caminho inexistente falha (é claro) find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"então o caminho está sendo encontrado (porque esse erro não acontece) mas findnão realiza a busca nele, e estou muito sem noção agora.

Só funciona se eu cd $HOME/MySymlinkedPathprimeiro remover a referência do caminho assim, find -name "run*.sh"mas isso não é bom para meus scripts.

Uma informação adicional:
este comando funciona normalmente ls $HOME/MySymlinkedPath/run*.sh, e se eu for lá cd $HOME/MySymlinkedPathe executar isso ls ..o resultado não é o que eu esperava - a lista do caminho onde o caminho do link simbólico está localizado - ele retorna a lista do caminho real na outra mídia /disco rígido!!!

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

Repensando:
Isso é um problema com finde lsou com meu sistema? ou é esperado e não é um problema? Estou no Ubuntu 12.10. Ele falha em todos os terminais que testei, então não parece um "problema" de terminal.

Responder1

Aquié a resposta. Mas essa questão aponta o bash como o alvo do problema.

A explicação é que findencontra "$HOME/MySymlinkedPath". É um link simbólico, não um diretório, então a descida recursiva para aí. Se a expressão correspondesse "$HOME/MySymlinkedPath"(por exemplo, in find "$HOME/MySymlinkedPath" -name 'My*'), findseria impressa como uma correspondência.

Conforme apontado lá, descobri que a maneira mais fácil/limpa de lidar com isso e corrigir todos os scripts é, em vez de:

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

basta adicionar uma barra, para que findnão comece no link simbólico, mas no destino do link simbólico:

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

Alternativamente, passe a -Hopção para find(observe que ela deve vir primeiro, antes dos caminhos) para instruí-lo a percorrer links simbólicos passados ​​em sua linha de comando. (Isso é diferente de -Lqual instrui finda atravessar links simbólicos encontrados durante a descida recursiva também.)

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

E finalmente funcionou melhor aqui -L(por causa dos vários sistemas de arquivos que eu criei links simbólicos através de pastas). Mas gera muitas mensagens de erro não problemáticas, então adicionei 2>/dev/null; e também decidi criar este alias alias find='find -L':

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

informação relacionada