Wine 工具将文件路径从 Linux 格式转换为 Windows 格式

Wine 工具将文件路径从 Linux 格式转换为 Windows 格式

我有一个 Windows diff 工具,它比我发现的任何 Linux diff 工具都要好(并且我已经做了一些漂亮的工作)对视觉差异工具的广泛分析)。我想在 Linux 上使用该工具(通过 Wine),并且能够将 Linux 文件路径传递给它,部分原因是像 Double Commander 这样的双窗格文件管理器在调用 diff 工具时会自动传递完整的文件路径。

所以我问的是相反的这个问题:如何将 Linux 样式的文件路径(包括转义字符(例如空格))转换为 Windows 样式的文件路径(通过 Wine 运行的 Windows 工具可以接受)?

举个简单的例子,

输入:

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

输出

“\path\to\file1.ext” “\path\to\file2.ext”

当然,在现实世界中,文件可以有空格之类的,所以我正在寻找一个比bash迄今为止的替代更可靠的解决方案:

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

答案1

你的剧本实际上非常接近。您所需要的只是winepath作为 WINE 一部分提供的工具来进行转换:

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

或者使用洛朗·贝尔科特execline:

/命令/execlineb -S2
反引号-i left { winepath --windows $1 }
反引号 -i 右 { winepath --windows $2 }
多重替代{
    重要 左 左
    重要的是正确的
}
葡萄酒
/utils/wincmp.exe ${左} ${右}

答案2

  1. 总是双引号你的变量,这样你就不需要关心空格或 shell 元字符。

  2. 您可以使用sedtr/s 转换为\.例如sed 's:/:\\:g'or tr '/' '\\'(注意:因为\是 shell 转义字符,所以需要转义才能将其视为文字反斜杠)。

  3. 或者,bash 的字符串操作运算符也可以完成这项工作(但不是 posix 标准,因此不可移植)。您犯的唯一错误是没有引用变量。

但请注意,正如@Michael Homer 所提到的,不需要修改路径分隔符......我wine program.exe /unix/path/to/file过去运行当然没有困难。

导致:

#!/bin/bash

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

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

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

或者

#!/bin/bash

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

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

甚至:

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

(但是最后一个版本没有给您任何机会对文件参数进行健全性检查,或进行任何类型的选项处理 - 例如 with getopts


最后,您可能需要重新考虑您对 Windows diff 工具的偏好,或者至少在做出决定之前进行更彻底的调查(您只评估了一小部分可用工具和 GUI 包装器)。基于 Windows/wine 的工具无法顺利集成到基于 Linux/UNIX 的开发工作流程中。

(就我个人而言,我主要使用diff -ucolordiff -u通过管道连接到less。鉴于我正在处理文本文件,因此不需要 GUI 界面。它也与我从git diffetc 获得的内容相同。在极少数情况下,我需要并排- side diff,我主要使用sdiff)。

相关内容