cygwin 上的 XArgs 命令正在破坏文件路径
我正在尝试在 Cygwin Windows 系统上使用 xargs 来删除本地删除的 SVN 文件。
我运行以下命令,生成以下输出:
svn status | grep '^\!' | sed 's/! *//'
weblings-webplatform\vendor\jetty-7.0.0.pre5\contexts-available\test-annotations.d\META-INF\MANIFEST.MF weblings-webplatform\vendor\jetty-7.0.0.pre5\contexts-available\test-annotations.d\WEB-INF\jetty-env.xml
然后,当我运行以下命令时,出现以下错误:
svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm %
svn: 'weblings-webplatformvendorjetty-7.0.0.pre5contexts-availabletest-annotations.dMETA-INFMANIFEST.MF' does not exist
我尝试过使用 cygpath 转换 svn 状态路径,但它似乎没有执行任何操作。
I'm trying to use xargs on a Cygwin Windows system to remove SVN files deleted locally.
I run the following command that generates the following output:
svn status | grep '^\!' | sed 's/! *//'
weblings-webplatform\vendor\jetty-7.0.0.pre5\contexts-available\test-annotations.d\META-INF\MANIFEST.MF
weblings-webplatform\vendor\jetty-7.0.0.pre5\contexts-available\test-annotations.d\WEB-INF\jetty-env.xml
Then when I run the following command I get the following errors:
svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm %
svn: 'weblings-webplatformvendorjetty-7.0.0.pre5contexts-availabletest-annotations.dMETA-INFMANIFEST.MF' does not exist
I've tried using cygpath to convert the svn status paths but it doesn't appear to do anything.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我认为使用 cygpath 将路径更改为 unix 格式应该可行。'\' 是 Linux 世界中的转义字符,看起来 xargs 处理它就像一个。像这样的东西:
Using cygpath to change the paths to unix format should work I think.. '\' is an escape character in the linux world, looks like xargs handles it like one. Something like:
将 cygwin
svn
(如果需要则安装)指定为/usr/bin/svn
,以便在/
的输出中获得/
。代码>svn状态。但要小心!你不想混合使用不同的 svn 版本,如 1.4、1.5、1.6,否则你会发现更多乐趣。Specify the cygwin
svn
(installing it if needed) as/usr/bin/svn
so that you get/
's in the output fromsvn status
. But be careful! You don't want to mix different svn versions like 1.4, 1.5, 1.6, or you'll be in for even more fun.使用 sed 将
\
更改为/
。 (正斜杠适用于 Windows API 和几乎所有 Windows 程序,必须明确拒绝它们才能工作。)您希望继续使用相同版本的 svn(就像您可能在其他地方使用的那样,例如使用 GUI),这样您不必担心损坏您的数据。或者将所有内容更改为使用 cygwin 的 svn 版本。
根本问题是 xargs 正在重新解释数据,无论是因为这就是它在 cygwin 上的工作方式,还是因为它必须通过 shell 传递所有内容(然后执行此操作),我不确定(直到明天才能测试) 。
Use sed to change the
\
into/
. (Forward slashes work with the Windows API and almost all Windows programs, they have to be specifically rejected to not work.) You want to keep using the same version of svn (as you might be using elsewhere, say with a GUI) so you don't have to worry about corrupting your data.Or change everything over to using cygwin's version of svn.
The root problem is xargs is re-interpreting the data, whether because that's how it works on cygwin or it has to pass everything through a shell (which then does it), I'm not sure (and can't test until tomorrow).
如果我正确理解你的问题,那么我会做一个小调整:在 xargs 语句中的替换变量周围添加双引号:
否则,包含空格的给定路径将告诉 rm 删除两个或更多文件,其中没有一个存在。例如,像 c:\Cygwin\My Stuff 这样作为输入传递给 rm 的行将变为
rm c:\Cygwin\My ; rm 东西
If I understand your problem correctly, then I would make one small adjustment: Add double quotes around the replacement variable, in the xargs statement:
Otherwise, a given path which contains a whitespace will tell rm to delete two files or more, none of which exist. I.E. a line like c:\Cygwin\My Stuff passed as input to rm becomes
rm c:\Cygwin\My ; rm Stuff