循环排除结果的bash说明

时间:2014-05-04 20:06:51

标签: bash shell

目的是从目录中的文件列表中排除某些文件(名称中包含“actors”)。这里我们有一个包含13个jar文件的目录:

12:58:42/mllib $for f in $SCALA_HOME/lib/*.jar; do echo $f; done
/usr/local/Cellar/scala/2.10.2/libexec/lib/akka-actors.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/diffutils.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/jline.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/process-0.1.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-actors-migration.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-actors.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-compiler.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-library.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-partest.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-reflect.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-swing.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scalap.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/typesafe-config.jar

目的是过滤掉/排除包含模式“actor”的jar文件。怎么做?以下是我尝试理解排除模式的注意事项(注意:排除项不是正则表达式,尽管它们看起来可能与[]相似:

a. Specify to exclude files containing "actors" string:
12:58:38/mllib $for f in $SCALA_HOME/lib/*[!actors*].jar; do echo $f; done
/usr/local/Cellar/scala/2.10.2/libexec/lib/jline.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/process-0.1.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-actors-migration.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-library.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-swing.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scalap.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/typesafe-config.jar

嗯,它 排除了scala-actors.jar。但是..它还排除了其他五个罐子并且*不*排除了scala-actors-migration.jar。

OOC让我们尝试逆向 - 即仅包括演员模式。由于我不熟悉语法,让我们尝试两种不同的方式:

尝试使用 actors .jar包含文件:

12:58:52/mllib $for f in $SCALA_HOME/lib/*[actors*].jar; do echo $f; done
/usr/local/Cellar/scala/2.10.2/libexec/lib/akka-actors.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/diffutils.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-actors.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-compiler.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-partest.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-reflect.jar

尝试在最后只包含* actors.jar的文件:

12:59:07/mllib $for f in $SCALA_HOME/lib/*[actors].jar; do echo $f; done
/usr/local/Cellar/scala/2.10.2/libexec/lib/akka-actors.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/diffutils.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-actors.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-compiler.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-partest.jar
/usr/local/Cellar/scala/2.10.2/libexec/lib/scala-reflect.jar

如果没有进一步讨论排除如何真正起作用,所有这些结果都无法解释。

1 个答案:

答案 0 :(得分:1)

如果您要列出/删除名称中包含"actor"的所有文件,则应执行以下操作:

echo ${SCALA_HOME}/lib/!(*actor*.jar)

您尝试的问题相当简单:您应该使用(...)代替[...]