Eu quero determinar todos os links simbólicos quebrados dentro de um diretório.
Na ignorância de uma solução melhor, tentei este bash one-liner simples (a versão do bash é 4.2.46, que pode valer a pena mencionar porque é um pouco datada):
for f in $(ls); do test -L "$f" || continue; test -e "$f" || echo "$f deadlink"; done
Infelizmente, isso não funciona. Eu tentei identificar o erro e se eu executar isso
for f in $(ls); do test -L $f && echo "$f is a valid symlink"; done
nenhuma saída é produzida, apesar dos links simbólicos existentes e válidos. Se eu executar o mesmo comando substituído $f
pelo nome do arquivo real, funcionará. Também f=filename; test -L $f && echo "$f is a valid symlink";
funciona como esperado, então o problema parece ser o loop.
o que estou perdendo?
Eu suspeito que o problema vem do
ls
uso de cores em sua saída. Como você está analisandols
a saída de , sels
as cores de saída, os códigos de escape correspondentes terminarão nos valores fornecidos paraf
etest
não conseguirão encontrar um arquivo correspondente. Comotest
falha no teste sem nenhuma saída nesses casos, você não seria o mais sábio.Em vez disso, use um glob:
Veja Como posso encontrar links simbólicos quebrados para outras soluções possíveis para o seu problema subjacente.