2012-04-03 69 views
3

我使用以下命令有时在使用hg时删除更改的文件。在命令之间转义管道输出

hg status -n | xargs rm 

我所遇到的,其中如果

hg status -n 

输出包含不会被发现与文件中的空格的文件路径的问题。通常我会引用或转义文件名称中的空格,但我不知道如何使用管道输出执行此操作。任何帮助将非常感谢:)

+0

没有回答这些问题的帮助? – Mikel 2012-04-05 16:35:01

+0

是的,谢谢,已接受您的答案 – Dori 2012-04-06 15:10:42

回答

4

告诉这两个命令来使用NUL作为分隔符:

hg status -n0 | xargs -0 rm 

另外要注意:在-n选项将打印甚至Mercurial不知道的文件。

也许你想要这个呢?

hg status -mn0 | xargs -0 rm 

另外,不要忘了hg reverthg purge。也许他们做你想做的事情,例如

hg revert --all --no-backup 

.hgrc

[extensions] 
hgext.purge= 

hg purge 
+0

+1 NUL是不需要惊喜的人的文件分隔符。 – l0b0 2012-04-03 15:10:51

+0

使用NUL作为分隔符的+1非常感谢!有时候我发现在那里抛出一个'grep'并删除一部分文件是很有用的 - 比如当我不小心创建了一个***。orig **的负载时 - 例如 - 这就是为什么'revert'或'purge'不能(看'hg help revert'我看到我可以用'-I'。现在我有两种方法来做一些事情,我学到了一些新的东西!) – Dori 2012-04-06 08:38:21

+0

请参阅'grep -z'了解如何过滤null-分界输出。 – Mikel 2012-04-12 03:27:09

2

我没有安装hg。因此,我将与ls做到这一点:

$ touch 'file A' 'file B' 

$ ls -1 
file A 
file B 

$ ls | xargs rm 
rm: cannot remove `file': No such file or directory 
rm: cannot remove `A': No such file or directory 
rm: cannot remove `file': No such file or directory 
rm: cannot remove `B': No such file or directory 

$ ls | tr '\n' '\0' | xargs -0 rm 

$ ls 
+0

似乎并不奏效。由于没有转义路径,仍然给出错误** rm:文件夹名称/测试:没有这样的文件或目录** – Dori 2012-04-03 12:08:47

+0

'hg status -n'返回什么? – kev 2012-04-03 12:11:56

+0

我只在使用'ls'时测试它'ls' – kev 2012-04-03 12:13:04

1

让xargs的处理,与-I选项:

hg status -n | xargs -I FileName rm FileName 

-I同时增加了安全性,但会降低效率,因为只有一个文件名会被传递为 'RM'

一个例子:

$ printf "%s\n" one "2 two" "three 3 3" | xargs printf "%s\n" 
one 
2 
two 
three 
3 
3 


$ printf "%s\n" one "2 two" "three 3 3" | xargs -I X printf "%s\n" X 
one 
2 two 
three 3 3 
0

除了-0,新xargs有选项-d它可以帮助你做这样的事情:

<command returning \n-separated paths> | xargs -d \\n rm -v