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 find
não realiza a busca nele, e estou muito sem noção agora.
Só funciona se eu cd $HOME/MySymlinkedPath
primeiro 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/MySymlinkedPath
e 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 find
e 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" de terminal.
Responder1
Aquié a resposta. Mas essa questão aponta o 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 para aí. Se a expressão correspondesse "$HOME/MySymlinkedPath"
(por exemplo, in find "$HOME/MySymlinkedPath" -name 'My*'
), find
seria 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 find
não comece no link simbólico, mas no destino do link simbólico:
find "$HOME/MySymlinkedPath/" -name "run*.sh"
Alternativamente, passe a -H
opçã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 -L
qual instrui find
a 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