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

9

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

Isso também falha:

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 find não realiza a pesquisa nele, e Estou muito sem noção agora.

Ele só funciona se eu cd $HOME/MySymlinkedPath primeiro e remover a referência de caminho assim find -name "run*.sh" , mas isso não é bom para meus scripts.

Uma informação adicional :
este comando funciona como de costume ls $HOME/MySymlinkedPath/run*.sh , e se eu for lá cd $HOME/MySymlinkedPath e executar este ls .. o resultado não é o que eu esperava - a lista do caminho onde o caminho com 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 :
Este é um problema com find e ls ou com o meu sistema? ou é esperado e não é um problema? Eu estou no Ubuntu 12.10. Ele falha em todos os terminais que testei, portanto, não parece um "problema" terminal.

    
por Aquarius Power 06.10.2013 / 23:29

1 resposta

14

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

A explicação é que find encontra "$HOME/MySymlinkedPath" . É um link simbólico, não um diretório, então a descida recursiva pára por aí. Se a expressão corresponder a "$HOME/MySymlinkedPath" (por exemplo, em find "$HOME/MySymlinkedPath" -name 'My*' ), então find imprimiria isso como uma correspondência.

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

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

adicione apenas uma barra, para que find inicie não a partir do link simbólico, mas do destino do link simbólico:

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

Como alternativa, passe a opção -H para find (observe que ela deve vir primeiro, antes dos caminhos) para informar que ela percorre os links simbólicos passados em sua linha de comando. (Isso é diferente de -L , que diz find para percorrer os links simbólicos encontrados durante a descida recursiva também.)

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

E finalmente funcionou melhor aqui com -L (por causa dos vários sistemas de arquivos que eu tenho link simbólico através de pastas). Mas gera cargas de mensagens de erro não problemáticas, por isso 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
    
por 06.10.2013 / 23:29