2012-04-03 70 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