Como criar um symlink que abra (literalmente) o arquivo de destino

6

Suponha que eu tenha um arquivo bar.txt dentro do diretório foo e crie um symlink baz.txt to foo/bar.txt . Como:

./foo
./foo/bar.txt
./baz.txt -> foo/bar.txt

Se eu abrir o baz.txt , meu editor achará que baz.txt está aberto no diretório . . Existe uma maneira de criar um link de tal forma que bar.txt seja (literalmente) aberto?

Contexto (ou porque estou tentando fazer isso): Eu tenho um diretório com uma grande coleção de arquivos que eu indexo e comento dentro de um arquivo .odt que permanece no mesmo diretório. Neste arquivo .odt eu crio hiperlinks para os arquivos indexados no diretório, para que eu possa acessar facilmente os arquivos individuais com (muito) mais contexto do que apenas o nome do arquivo. Eu configurei o LibreOffice para salvar os hiperlinks como caminhos relativos, de modo que esses links funcionem em todos os meus computadores, que nem sempre têm a mesma árvore de diretórios para meus arquivos de usuário.

Eu gostaria de criar um symlink (ou equivalente) para esse arquivo .odt , mas (nos termos do exemplo acima) se o link abrir baz.txt então os caminhos relativos (do ponto de vista do LibreOffice ) estará errado. Os hiperlinks anteriormente criados não funcionarão, e se eu criar um hyperlink em baz.txt (figurativamente, é claro), não funcionará no bar.txt original.

    
por gusbrs 30.07.2017 / 15:32

4 respostas

12

Não. Mas você pode criar um wrapper libreoffice que tomará cada argumento que é um symlink e o transformará em $(readlink -f $the_symlink) . Você pode então configurar seu gerenciador de arquivos para abrir arquivos libreoffice através desse wrapper.

lowrapper:

#!/bin/bash -e
args=()
for a; do
    case $a in 
        -*) args+=("$a");;  #skip flags (your file names don't start with -, right?)
        *)  if ! [ -L "$a" ]; then #not a link
                args+=("$a")
            else #link => target
                args+=( "$( readlink -f "$a")" )
            fi
            ;;
    esac
done
libreoffice "${args[@]}"

Agora, se você chmod +x lowrapper , colocá-lo em algum diretório do seu PATH e, em seguida, alterar o programa de tratamento de seus arquivos libreoffice de libreoffice para lowrapper , o libreoffice abrirá os destinos de link em vez dos links .

    
por 30.07.2017 / 15:42
3

Você não pode, mas o que você pode fazer é criar links simbólicos para o seu diretório "foo" da seguinte forma:

./foo
./foo/root -> .
./root -> foo/.

Em seguida, anexe "root" ao início de todos os seus hiperlinks. Agora, se você abrir seu documento a partir de ".", "Root" será resolvido em "foo /.", E seu "root / baz.txt" será resolvido em "foo /./ baz.txt". Se aberto a partir do próprio "foo", o mesmo "root / baz.txt" será resolvido em "./baz.txt" porque "root" aponta para ".".

    
por 30.07.2017 / 15:55
3

Eu não acho que haja alguma maneira de fazer exatamente o que você está pedindo. Links simbólicos são construções de sistema de arquivos. No entanto, pode haver uma solução alternativa decente se você criar um pequeno script que abra o destino do link em vez do link:

#!/bin/bash

i=0
declare -a targets
for file in "$@"; do
        targets[$i]="$(readlink -f "$file")"
        ((i++))
done
libreoffice "${targets[@]}"

Salve isso no seu PATH , por exemplo, como ~/bin/openLink.sh e torne-o executável:

chmod a+x ~/bin/openLink.sh'

Agora, abra o gerenciador de arquivos (você mencionou caja ), clique com o botão direito do mouse em um arquivo .odt e escolha "Abrir com" = > "Outro aplicativo":

Cliquenolink"Usar um comando personalizado" e coloque seu script lá:

Finalmente, feche tudo. Agora, cada vez que você clicar em um arquivo .odt , ele será aberto usando esse wrapper para que ele abra todos os links em seu diretório de destino. Observe que readlink -f em um arquivo regular apenas retorna o nome do arquivo, portanto, isso também funcionará para não-links.

    
por 30.07.2017 / 16:11
0

Acabei seguindo uma abordagem um pouco diferente, de criar um novo tipo de arquivo - vamos chamá-lo de "link simulado (ulated)" - que contém o caminho (relativo) do arquivo a ser aberto e depois criado um script lida com isso.

Considere o seguinte cenário:

./dir1/dir11/foo.odt
./dir2/foo.odl

"odl" para "Link do OpenDocument". O conteúdo de "foo.odl" é:

../dir1/dir11/foo.odt

Você pode então criar o seguinte script para abrir *.odl (adaptado da resposta de terdon):

#!/bin/bash

declare -a targets
for file in "$@"; do
    targets+=( "$(readlink -f "$( dirname "$file" )"/"$( <"$file" )")" )
done
libreoffice "${targets[@]}"

(Caso você não queira usar readlink porque ele seguirá o link caso o caminho assim especificado seja um symlink, você pode simplesmente ir com:)

#!/bin/bash

for file in "$@"; do
    cd "$( dirname "$file" )"
    libreoffice "$( <"$file" )"
done

Você pode associar esse script com .odl arquivos no gerenciador de arquivos (como explicado na resposta de terdon). Eventualmente, você terá que criar um tipo mime para .odl files e associá-lo ao script (faltando essa etapa no meu caso trabalhado, mas associou todos os arquivos de texto simples com o script, o que era claramente indesejável).

Por que eu preferi essa alternativa às oferecidas pelo PSkocik e pelo terdon, embora funcionem perfeitamente bem? Por três razões:

  • Nem todos os meus arquivos .odt (e links para eles) têm essa estrutura que eu tenho que abri-los "no diretório do arquivo de destino". Desta forma, eu afetaria o procedimento de abertura apenas dos arquivos de interesse.

  • Os links simbólicos regulares do sistema funcionarão independentemente das configurações do meu computador atual. Isso significa que, se eu abrir um desses arquivos em um computador no qual eu não alterei as configurações para abrir .odt arquivos com o meu script, ele será aberto de qualquer maneira e eu posso inadvertidamente atrapalhar os caminhos do meu script. hiperlinks dentro dele. Dessa forma, se o computador não estiver configurado para abrir .odl arquivos, eles simplesmente não funcionarão, e terei que ir diretamente para os arquivos de destino.

  • Por último, caso eu mova ou renomeie alguns dos diretórios envolvidos, posso pesquisar e substituir facilmente os arquivos .odl para corrigir os caminhos. (Isso também é possível com os links simbólicos, mas parece um pouco mais difícil).

Advertências: Acho que isso funcionará apenas para um caminho relativo bem formado, não redundante, fornecido no arquivo .odl . Provavelmente, existe uma maneira de fazer as coisas de maneira mais robusta, no sentido de que funcionaria também com um caminho absoluto ou com um caminho relativo com alguma redundância.

    
por 05.08.2017 / 21:39