![hg の文字列エスケープの改善](https://rvso.com/image/31684/hg%20%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%81%AE%E6%94%B9%E5%96%84.png)
そこで、バージョン管理システム 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
。このオプションは、引用符なしで null バイトで区切られたレコードに対して動作するように指示します。nullhg status -0
バイトで区切られたレコードを生成します。残っているのは、区切り文字として改行ではなく null を処理するために中間処理を適応させることです。
GNU awk またはレコード区切り文字として null バイトをサポートするその他の awk (BSD/OSX awk はサポートしていると思います) を使用すると、変換を awk に切り替えることができます。
hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove