Shell:如何使用自动脚本删除mercurial文件?

Shell:如何使用自动脚本删除mercurial文件?,shell,Shell,我想制作一个小脚本,删除Mercurail作为不需要的文件提供给我的Symfony项目中的所有文件 例如: hg status: ... ? web/images/lightwindow/._arrow-up.gif ? web/images/lightwindow/._black-70.png ? web/images/lightwindow/._black.png ? web/images/lightwindow/._nextlabel.gif ? web/images/lightwin

我想制作一个小脚本,删除Mercurail作为不需要的文件提供给我的Symfony项目中的所有文件

例如:

hg status:

...

? web/images/lightwindow/._arrow-up.gif
? web/images/lightwindow/._black-70.png
? web/images/lightwindow/._black.png
? web/images/lightwindow/._nextlabel.gif
? web/images/lightwindow/._pattern_148-70.png
? web/images/lightwindow/._pattern_148.gif
? web/images/lightwindow/._prevlabel.gif
? web/js/._lightwindow.js
? web/sfPropel15Plugin
? web/sfProtoculousPlugin
我想删除所有标有?的文件?。只有那些。不是那些修改过的-M-,等等

我正在尝试为此制作一个小脚本:

hg status | grep '^?*' | rm -f
我不知道是否可以。你能帮我拿一个吗?

试试这个:

hg status|awk '/^? /{gsub(/^\? /, "", $0);print;}'|while read line; do
    rm -f "$line"
done
awk命令匹配以“?”开头的所有内容,并执行块“{gsub/^\?/,$0;print;}”。区块对匹配的整行进行$0替换,替换起始行?没有任何内容,仅将$0作为文件名。然后打印$0打印,不带参数默认为打印$0

因此,awk输出打印一个文件名列表,每行一个。这将被送入一个读取循环,该循环将删除每个

这将保留文件名中的空白,但如果有任何文件名包含换行符,则会中断!使用hg status作为输入不可能优雅地处理换行符,因为hg status打印换行符分隔的输出

您缺少xargs,它将输入作为参数提供给命令,而您实际上是将它们发送到rm的标准输入,这没有意义。比如:

hg status | grep '^?' | cut -d' ' -f2 | xargs rm -f

注意:如果文件名中包含空格,则无效。这仍然是可能的,但你需要更加聪明。

谢谢。你能解释一下代码吗?从未使用过awk:/I正在使用它hg status | awk'/^/{gsub/^\?/,$0;print;}',但它给我带来了:M apps/cms/config/routing.yml,它不应该出现在结果中。如果我使用hg状态-u可以工作吗?因为它带来了所有未知状态?我不熟悉hg,但这是因为它正在stderr上打印-尝试使用hg status 2>/dev/null或hg status 2>&1>/dev/null。对于当前的答案和您的解决方案,您应该真正了解没有以null结尾的字符串的rm+xargs所导致的问题。如果您的文件名包含空格,您可能会得到一个相当令人不快的惊喜…您可以通过一些小的更改来修复您的空白问题:hg status | grep'^?| cut-b2-| xargs-rL1-i'{}'rm-rf'{},但这会在文件名中出现单引号问题,而上面的awk/read循环没有。