2012-02-24 82 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”