2011-11-01 48 views
4

我试图逃避cygwin的反斜杠,但它似乎几乎不可能 我已经尝试了很多东西,但没有工作的权利..传递给UNIX程序窗口路径中转义反斜线

echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo 
    echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo 

更具体地说我需要得到一个命令来接收输入在bash中没有 丢失反斜杠字符。每次我尝试传递一个参数时,反斜杠总是消失,破坏我的输入。我不知道 我怎么能告诉它只在输入单独留下反斜杠。

我曾尝试以下,但既不似乎工作

alias cyg0='cygpath '$*' ' 
    alias cyg1='cygpath "$*" ' 
    alias cyg2='cygpath "'$*'"' 

    alias cyg3='cygpath '[email protected]' ' 
    alias cyg4='cygpath "[email protected]" ' 
    alias cyg5='cygpath "'[email protected]'"' 


    [email protected] ~ 
    $ cyg0 C:\Users\Ted\Music\Enigma 
    C:UsersTedMusicEnigma 

    [email protected] ~ 
    $ cyg1 C:\Users\Ted\Music\Enigma 
    cygpath: can't convert empty path 

    [email protected] ~ 
    $ cyg2 C:\Users\Ted\Music\Enigma 
    cygpath: can't convert empty path 

    [email protected] ~ 
    $ cyg3 C:\Users\Ted\Music\Enigma 
    C:UsersTedMusicEnigma 

    [email protected] ~ 
    $ cyg4 C:\Users\Ted\Music\Enigma 
    C:UsersTedMusicEnigma 

    [email protected] ~ 
    $ cyg5 C:\Users\Ted\Music\Enigma 
    cygpath: can't convert empty path 

顺便说一句,我希望能够输入C:没有 引号\用户\泰德\音乐\谜。其中一个别名在使用引号时有效。

泰德

+0

我有同样的问题。我想运行“dir/b/s * .txt”来获取一组文件名,然后将它们传递给xargs进行处理,但是Windows dir命令的反斜杠输出与xargs不能很好地配合。最后,我使用了“find。-name * .txt”,它使用了正斜线。 (我使用xargs并从cygwin包中找到,但是在Windows cmd shell中。) – yoyo

+0

设置'x'选项以准确查看_bash_如何清除您的字符串。只需发出'set -x'。 – bobbogo

回答

7

请阅读标题为在bash引述部分(1)(man bash)。

在第一个例子中,

echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo 

壳解释(然后删除)双引号内反斜杠,所以第一个echo命令只能看到串C:UsersTedDocumentsUnixScripts

在你的第二个例子,

echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo 

单引号正确保护反斜杠,你可以通过运行仅仅是第一echo命令,没有| xargs echo看到。

在您的所有其余的例子,

cyg0 C:\Users\Ted\Music\Enigma 
cyg1 C:\Users\Ted\Music\Enigma 
... 

因为参数(C:\Users\Ted\Music\Enigma)是不带引号的,再次shell解释和命令之前删除反斜杠(cyg0cyg1,...)看到过他们。并且...

我希望能够输入C:\ Users \ Ted \ Music \ Enigma不带引号。

对不起,它不能完成。如果不将反斜杠放在单引号中,那么shell会将其解释为随后字符的引用字符,然后删除反斜杠。

您有几种选择:

  1. 使用命令行上单引号,以保护反斜线:

    cyg4 'C:\Users\Ted\Music\Enigma' 
    
  2. 报价每一个反斜杠字符分开,增加一倍它,例如

    cyg4 C:\\Users\\Ted\\Music\\Enigma 
    
  3. 改用正斜线:

    cyg4 C:/Users/Ted/Music/Enigma 
    

选项3可能真的是你最好的解决方案。不幸的是,反斜杠字符对于所有Unix shell来说只是一个非常特殊的字符,并且在处理DOS/Windows路径时会导致很多引用问题。但是众所周知的是,DOS/Windows也非常乐意使用正斜杠(/)作为其路径分隔符。尝试一下。

注意:在你的几个cyg *函数中,只有cyg1和cyg4是正确的。其他人使用不正确的引用。 cyg1仅对一个参数有用,因为它将所有参数合并为一个带引号的字符串,而cyg4可以接受并将多个参数传递给cygpath。但是,由于cyg4只传递其引用的参数,因此不会添加任何值;它和刚才的例子没有什么不同

cygpath C:/Users/Ted/Music/Enigma 

祝你好运。

+0

有趣的是,问题是我真的想只能在命令行中粘贴Windows路径。如果我想用斜杠代替反斜杠,我将不得不自己改变它们。无论如何,感谢您的帮助。 – Flethuseo

3

我读从Windows资源管理器粘贴到命令行的路径时,也有类似的问题:(ARG带“-r”)

echo "Please enter path (copy n paste from Win-Explorer):" 
read -r myWinPath; 

“读-r XYZ”命令不interprete单反斜线在粘贴的路径中。

myNewCygwinPath=`cygpath -a $myWinPath`; 
echo $myNewCygwinPath; 

维托里奥

2

有时是非常有用的给使用的程序的手册试试:-)。从man xargs

OPTIONS 
    -0, --null 
      Input items are terminated by a null character instead of by 
      whitespace, and the quotes and backslash are not special (ev- 
      ery character is taken literally). Disables the end of file 
      string, which is treated like any other argument. Useful when 
      input items might contain white space, quote marks, or back- 
      slashes. The GNU find -print0 option produces input suitable 
      for this mode. 

此选项的确保留了整条生产线。尝试:

echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs -0 echo 

“-0”为您做到了!

请注意,对于多于一个arg,您必须零终止参数,例如find ... -print0grep ... --null

+3

在字符串到达​​xargs之前,您的反斜杠将被删除。 – bobbogo

+0

@bobbogo您的观察对于原始答案是正确的,但我认为这只是一个疏忽。使用'-0'的想法是非常有用的(我忘记了这个选项保留了*所有*特殊字符),所以我冒昧地解决了你指出的错误,以便使答案更有用,成为蓝图。 –

1

我有同样的问题,当使用cygpath转换文件名如c:\ dirname到unix时,我得到c:dirname,甚至是怪异的东西。

原来,我的问题是我使用的文件名是用户输入的,我用“读取”命令检索。阅读,而不是cygpath,通过抛出反斜杠导致我的问题。 “读-r”解决了这个问题。

1

尝试:

echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs -0 echo 
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs -0 echo 

xargs的-0选项的解释(从gnu.org):

“输入文件名以空字符,而不是由空格终止,任何报价和反斜杠字符不被认为是特殊的(每个字符都是字面意思)。禁用文件字符串的结尾,这与其他任何参数一样。“

OR

你也可以用sed实现这一目标:

echo "C:\Users\Ted\Documents\Unix\Scripts" | sed 's/\\/\\\\/g' | xargs echo 
echo 'C:\Users\Ted\Documents\Unix\Scripts' | sed 's/\\/\\\\/g' | xargs echo 

这将取代所有\\\它被传递给xargs的面前,其中双\\后会有剥离回单\,而不是原始的情况下,从单一到无。

sed是一个有用的流编辑器工具,可用于简单的文本替换。这里有一个tutorial以及一些很好的例子。

语法取代如下:

s/string_to_replace/replace_with/g

  • g改性剂被用来替换所有发生。没有它,只有第一场比赛会被取代。
  • sed 's/\\/\\\\/g'的额外反斜杠用于转义每个\字符的特殊含义。因此,\\将是文字字符\,而\\\\将是\\

对于暂无报价,你将不得不使用\\代替\,作为标记的答案建议。

echo C:\\Users\\Ted\\Documents\\Unix\\Scripts | xargs echo 
2

我认识到这个答案对派对来说相当晚了......但是我自己偶然发现了同样的问题,却偶然发现了这个问题。

我正在使用Cygwin安装中的'xargs' - 并且 - 我正在从常规的cmd.exe shell中调用它。

对于我来说,我只是用了tr工具,也是在Cygwin的文件夹:

dir /b /s /a *.txt | tr "\\" "/" | xargs ...

这彻底解决了我的“斜线问题”。

相关问题