より良い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の安全性」ではないと言います。

誰でも「!」とリストされているファイルを削除するより良い方法を見つけることができますか?それとも行方不明ですか?

答え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オプションがサポートされています。ヌルバイトで区切られたレコードを生成します。残りは、改行文字の代わりにヌルを区切り文字として扱うように中間処理を調整することです。-0hg 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

関連情報