2012-08-31 73 views
1

請考慮我在名爲test的文件夾中有許多shell腳本。我想執行除了一個特定文件以外的所有文件。我該怎麼辦?重新定位文件或手動執行文件不是一種選擇。有沒有什麼辦法可以在單線上做到這一點。或者,可以添加一些sh path/to/test/*.sh,它執行所有文件?命令行:使用通配符時忽略特定文件

+0

你的意思是我想包括除一人外的所有文件? –

回答

4
for file in test/*; do 
    [ "$file" != "test/do-not-run.sh" ] && sh "$file" 
done 

如果您正在使用bash,您可以使用擴展模式,以跳過不需要的腳本:

shopt -s extglob 
for file in test/!(do-not-run).sh; do 
    sh "$file" 
done 
+0

+1用於extglob-usage :-) – plundra

1
for FILE in `ls "$YOURPATH"` ; do 
    test "$FILE" != "do-not-run.sh" && sh "$YOURPATH/$FILE"; 
done 
+0

如果有任何包含空格的路徑,解析'ls'的輸出將會失敗。 – chepner

1

find path/to/test -name "*.sh" \! -name $pattern_for_unwanted_scripts -exec {} \;

查找將遞歸執行中到底該目錄中的所有條目在.sh(-name「* .sh」)並且不匹配不需要的模式(\!-name $ pattern_for_unwanted_scripts)。

0

bash,只要你做shopt -s extglob您可以使用「擴展通配符」,允許使用哪些匹配除了給定的模式之一什麼!(pattern-list)

你的情況:

shopt -s extglob 
for f in !(do-not-run.sh); do if [ "${f##*.}" == "sh" ]; then sh $f; fi; done 
+0

這將匹配不是「do-not-run.sh」的每個文件。 – chepner

+0

是的你是對的,在'.sh後綴'上加了測試 –

+0

或者,把擴展名移出負模式:'!(不要運行).sh'匹配所有的「* .sh」文件,除了「do -not-run.sh」 –