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

13

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

Isso também falha:

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

E apenas para ter certeza, esse caminho inexistente falha (é claro), find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"portanto o caminho está sendo encontrado (porque esse erro não ocorre), mas findnão realiza a pesquisa nele, e eu sou muito ignorante agora.

Só funciona se eu cd $HOME/MySymlinkedPathprimeiro remover a referência de caminho desta maneira, 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*.she, se eu for lá cd $HOME/MySymlinkedPathe executar isso, ls ..o resultado não é o que eu esperava - a lista do caminho em que o caminho com o link simbólico está localizado - ele retorna a lista do caminho real em a outra mídia / disco rígido !!!

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

Repensando :
Esse é um problema com finde ls/ ou 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" do terminal.

Poder de Aquário
fonte
1
Encontrei uma resposta melhor "encontre-siga". stackoverflow.com/questions/105212/…
Jarod 10/01
A página de manual do @Jarod diz que -follow está obsoleta e devemos usar -L (que também é --follow) como na minha resposta abaixo:>
Aquarius Power

Respostas:

19

Aqui está a resposta. Mas essa pergunta aponta para 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 pára por aí. Se a expressão corresponder "$HOME/MySymlinkedPath"(por exemplo, em find "$HOME/MySymlinkedPath" -name 'My*'), ela findserá impressa como uma correspondência.

Como apontado lá, descobri que a maneira mais fácil / limpa de lidar com ele 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"

Como alternativa, passe a -Hopção para find(observe que ela deve vir primeiro, antes dos caminhos) para instruí-la a percorrer os links simbólicos passados ​​em sua linha de comando. (Isso é diferente do -Lque diz findpara atravessar os 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 com os quais vinculei pastas). Mas gera muitas mensagens de erro não problemáticas, então adicionei 2>/dev/null; e também decidiu criar esse alias alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null
Poder de Aquário
fonte
2
IMHO, geralmente é uma boa prática usar uma barra após os diretórios para indicar que eles são realmente diretórios. :) Torna as coisas mais legíveis etc.
dannysauer