nemo: Ação do menu de contexto Disparando um script que força o link simbólico selecionado a ser relativo

1

Meu objetivo é poder clicar com o botão direito do mouse em um link simbólico em nemo , acionando um script personalizado que força o link a ser reescrito como um caminho relativo, caso ele possua um caminho absoluto sobre o ato .

O problema é que DRAG+SHIFT+CTRL é codificado dentro de nemo para produzir um symlink de caminho absoluto. Isso causa problemas quando tento acessar o sistema de arquivos remotamente.

Meu problema é que gostaria de manter o gesto DRAG+SHIFT+CTRL , não gostaria de criar nemo da fonte e gostaria de poder navegar em qualquer número de diretórios vinculados irrelevantemente remotamente.

Minha solução proposta é criar uma nova opção de menu de contexto em nemo que me permita "consertar" qualquer um desses links acionando um script.

Eu criei com êxito a opção do menu de contexto criando um novo arquivo .nemo_action usando the template no GitHub .

Existem dois diretórios para esses tipos de arquivos:

  • /usr/share/nemo/actions/ para ações em todo o sistema
  • $HOME/.local/share/nemo/actions/ para ações do usuário

meu arquivo fix-link.nemo_action é o seguinte:

[Nemo Action]
Active=true
Name=Force Relative Link
Comment=If the file is a link to an absolute path, it will be forced to become relative.
Exec=<fix-link.sh %F>
Selection=any
Extensions=nodirs;
EscapeSpaces=true

e meu arquivo fix-link.sh (no mesmo diretório) é o seguinte:

#!/bin/bash
$(ln "-rs" $(readlink -f "$1") "$1.tmp")
mv -f "$1.tmp" $(readlink -f "$1")
exit 0

Meu arquivo temporário está sendo criado muito bem, mas ele se recusa a sobrescrever o caminho de arquivo retornado por $(readlink -f "$1") . Eu acho que pode ter algo a ver com as permissões definidas por nemo quando eu estou inicialmente DRAG+SHIFT+CTRLl ing para criar o link de caminho absoluto.

EDITAR

@Gilles corrigiu muitos erros no meu script, quando descobri que também precisava alterar a linha Extensions=nodirs; no arquivo fix-link.nemo_action para ler Extensions=any; , caso contrário eu nunca conseguiria ativar este script através do menu de contexto em até mesmo um link para um diretório, que era o propósito inteiro para isso.

TÃO AGORA

fix-link.nemo_action é o seguinte:

[Nemo Action]
Active=true
Name=Force Relative Link
Comment=If the file is a link to an absolute path, it will be forced to become relative.
Exec=<fix-link.sh %F>
Selection=any
Extensions=any;
EscapeSpaces=true

e meu arquivo fix-link.sh é o seguinte:

#!/bin/bash
ln -rs -- "$(readlink -f -- "$1")" "$1.tmp"
mv -f -- "$1.tmp" "$1"

e tudo está certo no mundo. Obrigado a todos.

    
por Richard LeClair 08.08.2015 / 04:53

1 resposta

1

Existem vários problemas com o seu script.

  • Falta de aspas duplas em torno de $(readlink …) . Isso será interrompido se o destino do link contiver espaços em branco ou caracteres curinga.
  • Você está usando uma substituição de comando em torno do comando ln e usando o resultado como um comando para ser executado. Felizmente, isso não causa nenhum dano, pois ln não produz saída.
  • Seu comando mv move o link simbólico para o local de destino, o que não faz sentido.

Acho que isso é o que você quis escrever:

#!/bin/sh
ln -rs -- "$(readlink -f -- "$1")" "$1.tmp"
mv -f -- "$1.tmp" "$1"

Como alternativa, você pode usar o utilitário symlinks (originalmente de Mark Lords, agora mantido por J. Brandt Buckley), presente em muitas distribuições Linux. O comando symlinks -c /path/to/directory converte todos os links simbólicos no diretório especificado em links relativos.

    
por 08.08.2015 / 13:56