问题描述
我的剪贴板中经常有Windows绝对路径(例如C:\test
),我想将其粘贴到git-bash
中。如果我将路径用单引号引起来,这通常会起作用:
$ ls 'C:\test'
bar.txt foo.txt baz.exe dat.exe
$ ls 'C:\test\*.txt'
ls: cannot access 'C:\test\*.txt': No such file or directory
$ ls 'C:\test\'*.txt
ls: cannot access 'C:\test\*.txt': No such file or directory
我知道如果将路径转换为Unix风格(即/c/test/*.txt
)会起作用,但这并不是很方便,因为我已经在剪贴板中有了Windows路径。
有什么想法吗?
解决方法
我最终用C#编写了一个控制台应用程序,该应用程序可以在Windows和git-bash
之间切换剪贴板中的路径。我只是进入剪贴板的路径,运行此应用程序,它会更新剪贴板以具有相反的样式路径。然后我就粘贴。
using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace SwitchPath
{
internal static class Program
{
private const RegexOptions Options =
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant |
RegexOptions.Multiline;
private static readonly Regex WinPath = new Regex(
@"^([a-z]):\\(.+)$",Options);
private static readonly Regex UnixPath = new Regex(
@"^/([a-z])/(.+)$",Options);
[STAThread]
private static void Main()
{
var path = Clipboard.GetText().Trim();
string drive,rest;
var m = WinPath.Match(path);
if (m.Success)
{
drive = m.Groups[1].Value.ToLowerInvariant();
rest = m.Groups[2].Value.Trim().Replace(@"\","/");
path = $"/{drive}/{rest}";
Clipboard.SetText(path);
return;
}
m = UnixPath.Match(path);
if (m.Success)
{
drive = m.Groups[1].Value.ToUpperInvariant();
rest = m.Groups[2].Value.Trim().Replace("/",@"\");
path = $@"{drive}:\{rest}";
Clipboard.SetText(path);
}
}
}
}