2012-02-24 77 views
2

我想通過在同一個目錄中的文件只有一個4中他們只迭代一個「4」。shell腳本文件,通過迭代與文件名

這是我到目前爲止所。我目前的腳本的問題是,與任意數量的4個文件的獲取所選,而不是文件只有一個4

for i in *4*.cpp; 
do 

... 

有點像[!4]但對於任何數量的非4個字符。 * HTTP://www.tuxfiles.org/linuxhelp/wildcards.html

我想通過文件名如me4.cpp,4.cpp和hi4hi.cpp迭代

我想忽略文件名如lala.cpp,44.cpp,4hi4.cpp

謝謝!

想通了。我突然嘗試[!4] *。 糟糕,我沒有。這被解釋爲([!4]),那麼(*)

+1

'*'沒有按」包括'4.cpp'並且包含'lala.cpp'。另一種解決方案是使用'找到-regex',但我不知道在這種情況下用什麼樣的表情...... – 2012-02-24 00:10:50

+0

'[!4] *''包括a44.cpp','a444.cpp ','a4444.cpp'等 – 2012-02-24 00:54:56

回答

3

您所需要的grep作風正則表達式是:

^[^4]*4[^4]*$ 

行開始後的一幫不-4中,4,和另外一羣非4的人到了隊尾。

在純外殼,可以考慮使用case聲明:

for file in *4*.cpp 
do 
    case "$file" in 
    (*4*4*) : Ignore;; 
    (*)  : Process;; 
    esac 
done 

這看起來包含4名的,然後忽略包含2個或更多4的那些。

+0

這同樣不包括'4.cpp'。您可以通過在[^ 4] * 4 [^ 4] *'中爲[i]來將該grep語法合併到Bash的通配符功能中。 – 2012-02-24 00:23:04

+0

@丹尼爾:爲什麼不包括4.cpp? '* 4 * .cpp'這個模式當然包括'4.cpp'; * 4 * 4 *'模式不排除它。你是否想到正則表達式,而不是殼體通配符。這些星星是球體;在正則表達式的術語,每個'*'相當於'。*'(零個或多個任意字符),而不是一個前一字符的重複。 – 2012-02-24 00:51:25

0

如何使用find

find ./ -regex "<regular expression>" 
0

假設慶典:[!4]

shopt -s extglob 
for file in *([^4])4*([^4]).cpp; ... 

其中*([^4])意味着零個或多個字符不是 「4」