Digamos que eu tenha dois caminhos: <source_path>
e <target_path>
. Gostaria que o meu shell (zsh) para automaticamente descobrir se há uma maneira de representar <target_path>
a partir <source_path>
de um caminho relativo.
Por exemplo, vamos assumir
<source_path>
é/foo/bar/something
<target_path>
é/foo/hello/world
O resultado seria ../../hello/world
Por que eu preciso disso:
Eu preciso criar um link simbólico <source_path>
para <target_path>
usar um link simbólico relativo sempre que possível, pois caso contrário, o servidor samba não mostrará o arquivo corretamente quando eu acessar esses arquivos na rede a partir do Windows (eu não sou o administrador do sistema e não ' não tem controle sobre essa configuração)
Supondo que <target_path>
e <source_path>
sejam caminhos absolutos, o seguinte cria um link simbólico apontando para um caminho absoluto .
ln -s <target_path> <source_path>
para que não funcione para minhas necessidades. Eu preciso fazer isso para centenas de arquivos, então não posso corrigi-lo manualmente.
Algum shell embutido que cuida disso?
symlinks
para converter links absolutos em relativos.Respostas:
Você pode usar o
symlinks
comando para converter caminhos absolutos em relativos:Temos links absolutos, vamos convertê-los para relativo:
Referências
fonte
Tente usar o
realpath
comando (parte do GNUcoreutils
; > = 8.23 ), por exemplo:Se você estiver usando o macOS, instale a versão GNU via:
brew install coreutils
e usegrealpath
.Observe que os dois caminhos precisam existir para que o comando seja bem-sucedido. Se você precisar do caminho relativo de qualquer maneira, mesmo que um deles não exista, adicione a opção -m.
Para obter mais exemplos, consulte Converter caminho absoluto em caminho relativo, dado um diretório atual .
fonte
realpath: unrecognized option '--relative-to=.'
:( realpath versão 1.19realpath
. Se você estiver em MacOS, instale via:brew install coreutils
.realpath (GNU coreutils) 8.26
onde o parâmetro está presente. Veja: gnu.org/software/coreutils/realpath Verifique duas vezes se você não está usando um alias (por exemplo, execute como\realpath
) e como instalar a versão a partir docoreutils
.Eu acho que essa solução python (tirada do mesmo post que a resposta de @ EvanTeitelman) também merece ser mencionada. Adicione isso ao seu
~/.zshrc
:Você pode fazer, por exemplo:
fonte
sys.argv
. Se o código postado estiver errado ou puder ser aprimorado, sinta-se à vontade para fazê-lo com meus agradecimentos.Não há nenhum shell embutido para cuidar disso. Eu encontrei uma solução no Stack Overflow . Copiei a solução aqui com pequenas modificações e marquei esta resposta como wiki da comunidade.
Você pode usar esta função da seguinte maneira:
fonte
Esta é a solução mais simples e mais bonita para o problema.
Também deve funcionar em todas as conchas semelhantes a bourne.
E a sabedoria aqui é: não há absolutamente nenhuma necessidade de serviços externos ou mesmo condições complicadas. Algumas substituições de prefixo / sufixo e um loop while são tudo o que você precisa para fazer qualquer coisa em shells semelhantes a bourne.
Também disponível via PasteBin: http://pastebin.com/CtTfvime
fonte
Makefile
precisava adicionar um par de aspas duplas à linhapos=${pos%/*}
(e, é claro, ponto-e-vírgula e barras invertidas no final de cada linha).relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. Em adição, você se esquece de mencionar que todos os caminhos devem ser absoluta e canonicalized (ou seja,/tmp/a/..
não trabalho)Eu tive que escrever um script bash para fazer isso de forma confiável (e, claro, sem verificar a existência do arquivo).
Uso
Retorna um caminho de origem relativo.
exemplo:
ambos recebem
../../CC/DD/EE
Para fazer um teste rápido, você pode executar
resultado: uma lista de teste
BTW, se você deseja usar esse script sem salvá-lo e confia nesse script, há duas maneiras de fazer isso com o truque do bash.
Importe
relpath
como uma função bash seguindo o comando (Requer bash 4+)ou chame o script on-the-fly como com curl bash combo.
fonte