这是我的最终剧本

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy." | xargs svn add 2>/dev/null

为了测试我不想将它添加到svn所以我使用

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy."

注意:我想忽略以'。'开头的文件。 (在当前和子文件夹中)但无法弄清楚我是如何定居的.svn

我尝试删除额外的greps来生成一个正则表达式但是对于我的生活我无法忽略当前和子文件夹中的.svn(或.FILE)并且我无法忽略它.tab。或.yy。

一个问题是我无法理解如何制作^。 (忽略,如果以?开头)工作。我确定一个问题是我做的事情。*这会忽略我的.tab。规则,我不知道如何到处走。

有帮助吗?

解决方案

你的根本问题是你认为你可以这样做:

[^(~$|\.o$|\.exe)]

你不能。

在一个字符类中(这就是你所拥有的)你可以包含(或排除)单个字符,但你不能在那里写表达式。以上是相同的(就正则表达式引擎而言):

[^()~$|.oex]

我在Windows上,所以我无法给你一个经过测试的命令,你的帖子让我有点疑惑你真正想要的文件。因此,这意味着关于正则表达式误解的正确方向。

其他提示

  

注意:我想忽略以'。'开头的文件。 (在当前和子文件夹中)但无法弄清楚我是如何定居的.svn

     

一个问题是我无法理解如何制作^。 (忽略,如果以?开头)工作。我确定一个问题是我做的事情。*这会忽略我的.tab。规则,我不知道如何到处走。

find 上的 -regex 测试应用于完整路径,而不仅仅是文件名。从手册页:

  

例如,要匹配名为“./fubar3”的文件,可以使用正则表达式“。* bar”。或'。* b。* 3',但不是'f。* r3'。

soulmerge的回答提供了一种方法来将所有条件都纳入find语句;你也可以用

之类的东西来做
find * -regex 'include-pattern' -a ! \( -regex 'exclude-pattern' [-o 'exclude-pattern2' ...] \)

如果你想要组合多个模式来排除,无论是在你的管道格斗中还是在查找的正则表达式中,只需使用或:

grep -v '\.svn\|.tab.\|.yy.'
egrep -v '\.svn|.tab.|.yy.'

请注意,对正则表达式使用单引号是一个非常非常好的主意 - 您不希望任何$尝试变量扩展。

编辑: 那些排除您建议的模式实际上不需要是正则表达式。你可以使用-name来获取它们,它只匹配实际名称,而不是整个路径。

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)

您可以通过 -prune 告诉 find 忽略某些文件夹及其内容。而且你不需要这里的正则表达式,其他的find命令就足够了。如果您希望能够处理带空格的文件名,我还会使用 -print0 。总结一下,这应该做你需要的:

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add

我不是100%确定你想要实现的目标,但是 find -regex'^。* / [^。]。*'应该可以工作(在开始时匹配任何非点字符)这个名字。)。

Grep支持多种模式。 E.g:

grep -v -e "\.svn" -e ".tab." -e ".yy."
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top