2014-05-04 33 views
1

其目的是從目錄中的文件列表中排除某些文件(名稱中包含「actors」)。在這裏,我們有13 JAR文件的目錄:bash for循環排除結果的說明

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 

的目的是過濾掉/排除含圖案的「演員」裏面的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 

嗯,它排除階-actors.jar。但是,它也排除了其他五個罐子,並且不*排除了scala-actors-migration.jar。

OOC讓我們嘗試一下 - 即只包含演員模式。由於我不熟悉的語法,讓我們嘗試兩種不同的方式:

嘗試包括文件與演員的.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

如果要列出/刪除所有文件在其名稱中"actor"的那些,你應該做到以下幾點:

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

你嘗試的問題是相當語法的梅特:你應使用(...)而不是[...]

+0

HI魯本斯,有一個鮮爲人知的能力稱爲排除:這就是適用於這裏。 Globbing確實起作用,但是你的回答忽略了有關使用排除的觀點 – javadba

+0

意圖是以名字排除具有演員的EXCLUDE文件 – javadba

+0

@javadba剛剛明白你的意思! :)請參閱編輯。 – Rubens