更好的 hg 字串轉義

更好的 hg 字串轉義

因此,我會定期刪除版本控制系統 hg 列出的缺失檔案。我注意到的是,我的這個(誠然醜陋的)腳本沒有正確轉義字串:

hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove

它在很多情況下都有效,但一些奇怪的字串會recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf導致它損壞。順便說一句,hg 告訴我這些字串不是「Windows 安全的」…不管這是什麼意思。

有人可以找到更好的方法來刪除 hg 列出為“!”的檔案嗎?或失蹤?

答案1

我用:

hg addremove

為了那個原因在我從簽出目錄中刪除任何殘骸之後(或者在我向文件添加模式之後.hgignore)。
hg addremove -h告訴你:

Add all new files and remove all missing files from the repository.

Mercurial 抱怨*檔案名稱中的 。這是一個保留字符,不能在 Windows 上的檔案名稱中使用。然而,該訊息本身不會stderr影響管道的功能。

另一種方法是使用:

hg remove --after

它標記已刪除的文件,但對所有文件(仍然存在的文件和已刪除的文件)進行評論,並且似乎對該--quiet選項沒有反應。

答案2

xargs看到\!\(\*-4.pdf它的輸入時,它就理解了!(*-4.pdf。如果您使用xargs,則需要產生與其輸入語法相符的輸入,這與其他任何內容不同。僅在空格前加入反斜線只能處理空格。

在 Linux、*BSD 和 OSX 上,xargs支援選項-0,該選項告訴它對由空位元組分隔且不帶引號的記錄進行操作。hg status -0產生由空字節分隔的記錄。剩下的就是調整中間處理來處理空值而不是換行符號作為分隔符號。

使用 GNU awk 或任何其他支援空位元組作為記錄分隔符號的 awk(我認為 BSD/OSX awk 可以),您可以將轉換切換到 awk。

hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove

相關內容