Existe uma alternativa readlink -f
/ não recursiva que gera destinos absolutos de links simbólicos? realpath
Uma solução mais compatível com POSIX também é bem-vinda.
Eu tenho um bloco de função no meu script de shell da seguinte forma:
set FILES
# addFile adds a file to the FILES list. If file is a symlink,
# it will also find and add the destination.
addFile() {
file="$1"
# Check if file is already included in list
echo "$FILES" | grep -q "$file" && return
FILES="$FILES $file"
if [ -L $file ]; then
addFile $(realpath $file)
#addFile $(readlink $file)
fi
}
Estou usando essa função em um script que coleta arquivos binários e de biblioteca de todo o sistema de arquivos. Mas prevejo um problema neste código:
- Minha primeira tentativa eu usei
readlink
, mas isso retornou caminhos de resolução de link simbólico em relação ao$file
, portanto, todas as ações executadas nesses caminhos falham. (Agora comentado, mas ainda no código) (Veja a edição menor abaixo) - Depois disso, usei
realpath
, conforme sugerido porman readlink
. Quase funciona.
Agora, as ações que desejo executar podem funcionar. No entanto, no resultado final, estou copiando todos os binários, bibliotecas e links simbólicos em um arquivo initramfs. Se houver links simbólicos recursivos, apenas o nível superior e o destino serão incluídos, não os intermediários. Assim, quebrando o link simbólico.
Eu criei um violino para demonstrar o problema. link-to-link1
aponta para link1
, que aponta para file1
. No resultado final link1
está faltando e link-to-link1
está quebrado.
Editar; esclarecer a questão
Ao executar a função acima no seguinte conjunto de links simbólicos:
# Contents of ~/test/src
file0
file1
link0 -> file0
link0.1 -> file0
link1 -> file1
link-to-link1 -> link1
Com:
copy="link-to-link1 link0 link0.1"
for sf in $copy; do
addFile ~/test/src/$sf
done;
cp -av $FILES ~/test/dst
Você descobrirá que apenas os 3 links $copy
e 2 arquivos são copiados. No entanto, o link intermediário link1
está ausente e link-to-link1
quebrado.
Eu gostaria que o script encontrasse link1
também. Lembrando que no ambiente onde este script é executado, a localização dos arquivos e links simbólicos deve ser absoluta.
Edição menor
Adicione outro violino para demonstrar a falha de caminhos relativos, usando readlink
. Apenas os links simbólicos são copiados e os destinos estão ausentes.
Se entendi bem, pelo exemplo dado, você quer
link1
para o arquivolink-to-link1
. Isso você pode obter usando GNUfind
e :-printf
%l
Como o caminho absoluto de
link1
é necessário como saída para/path/to/link-to-link1
, talvezcd
para o diretório que contémlink-to-link1
e executereadlink
/realpath
em sucessão:realpath -s
não resolve links simbólicos, mas imprime o caminho absoluto.Por exemplo:
Isso também funcionará para links para caminhos absolutos: