在命令之间转义管道输出

时间:2012-04-03 11:51:16

标签: bash pipe

我使用以下命令有时在使用hg时删除已更改的文件。

hg status -n | xargs rm

我遇到了一个问题,如果输出

hg status -n

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

-0旁边,较新的xargs-d选项可以帮助您完成此类操作:

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