Converte o caminho do arquivo do Linux para o formato Windows para a ferramenta Wine

1

Eu tenho uma ferramenta de comparação do Windows que é simplesmente melhor do que qualquer ferramenta de comparação do Linux que eu encontrei (e eu fiz algumas bonitas extensa análise sobre ferramentas de diff visual ). Eu quero usar essa ferramenta no Linux (via Wine) e ser capaz de passar os caminhos de arquivo do Linux para ela, em parte porque gerenciadores de arquivos de dois painéis como o Double Commander passam automaticamente os caminhos de arquivos completos ao chamar a ferramenta diff.

Estou perguntando o contrário de this question : Como posso converter os caminhos de arquivo no estilo Linux, incluindo caracteres de escape, como espaços, para caminhos de arquivos no estilo Windows que seriam aceitos por uma ferramenta do Windows executada via Wine?

Para um exemplo simplista,

Entrada:

/path/to/file1.ext /path/to/file2.ext

Saída

"\path\to\file1.ext" "\path\to\file2.ext"

É claro que, no mundo real, os arquivos podem ter espaços e outras coisas, portanto, estou procurando uma solução mais confiável do que a substituição bash que tenho até agora:

#!/bin/bash
p1=$1
p2=$2
wine /utils/wincmp.exe ${p1//\//\} ${p2//\//\}
    
por Dan Dascalescu 28.12.2017 / 07:49

2 respostas

3

Seu script é realmente muito próximo. Tudo o que você precisa é da ferramenta winepath , que faz parte do WINE, para fazer a conversão:

#!/bin/sh
exec wine /utils/wincmp.exe "'winepath --windows \"$1\"'" "'winepath --windows \"$2\"'"

Ou usando execline : de Laurent Bercot

#!/command/execlineb -S2
backtick -i left { winepath --windows $1 }
backtick -i right { winepath --windows $2 }
multisubstitute {
    importas left left
    importas right right
}
wine 
/utils/wincmp.exe ${left} ${right}
    
por 28.12.2017 / 09:53
1
  1. Sempre cite suas variáveis para que você não precise se preocupar com espaços ou metacaracteres de shell.

  2. você pode usar sed ou tr para converter / s em \ . por exemplo. sed 's:/:\:g' ou tr '/' '\' (nota: porque \ é o caractere de escape do shell, ele precisa ser escapado para ser tratado como uma barra invertida literal).

  3. Como alternativa, os operadores de manipulação de string do bash farão o trabalho (mas não são posix padrão, portanto não são portáteis). O único erro que você fez lá foi não citar as variáveis.

Mas note que, como mencionado por @Michael Homer, não deve ser necessário modificar o separador de caminho ... Eu certamente não tive nenhuma dificuldade em executar wine program.exe /unix/path/to/file no passado.

resultando em:

#!/bin/bash

p1="$1"
p2="$2"

# optional transformation
p1="$(printf "%s" "$p1" | tr '/' '\')"
p2="$(printf "%s" "$p2" | tr '/' '\')"

wine /utils/wincmp.exe "$p1" "$p2"

ou

#!/bin/bash

p1="${1//\//\}"
p2="${2//\//\}"

wine /utils/wincmp.exe "$p1" "$p2"

ou até mesmo:

#!/bin/bash
wine /utils/wincmp.exe "${1//\//\}" "${2//\//\}"

(mas esta última versão não oferece a você qualquer oportunidade de checar os argumentos do arquivo ou fazer qualquer tipo de tratamento de opções - por exemplo, com getopts )

Por fim, convém reconsiderar sua preferência por uma ferramenta de comparação do Windows ou pelo menos realizar uma pesquisa mais completa antes de decidir (você avaliou apenas um pequeno subconjunto de ferramentas disponíveis e wrappers de GUI). Uma ferramenta baseada em Windows / wine não se integrará agradavelmente ao fluxo de trabalho de desenvolvimento baseado em Linux / UNIX.

(pessoalmente, uso principalmente diff -u ou colordiff -u em less . Como estou trabalhando com arquivos de texto, não há necessidade de uma interface GUI. Também é idêntico ao que recebo de git diff etc. Nas raras ocasiões eu preciso de um diff lado-a-lado, eu uso principalmente sdiff ).

    
por 28.12.2017 / 08:18