2013-05-22 34 views
0

我在一个名为src的目录中有一堆C++文件。我需要找到所有有*Test.cc但没有.cc文件类型的文件,所以它只是[filename]Test。 我目前有:解析bash中的字符串

1 FILES=./src/*Test.cc 
    2 
    3 for f in $FILES 
    4  do 
    5   echo "processing $f" 
    6 done 

,所以我只需要在文件的名称,没有./src/,没有.cc。例如,上面的脚本会产生:

processing ./src/UtilTest.cc 

而我只需要UtilTest。我怎么能做到这一点?

回答

3

插入的线4和5之间这条线将导致您的bash段,以产生所需的输出:

f=$(basename $f .cc) 
2

可以完成与此一个衬里命令:

首先是将它存储在参考文件:

find ./src/ -name *Test.cc | tee samp.txt 

然后打印或将它取决于你想用文件做什么:

cat samp.txt | while read i; do echo `basename $i .cc`; done; 
1

只是为了显示你的另一种选择:更高版本的bash的(不知道了哪个版本),你可以使用数组和字符串操作:

files=(.src/*Test.cc)  # create bash array (space-separated) 

for f in ${files[@]##./} # loop through array, stripping leading path 
do 
    echo ${f%%.*}   # f is now array element; strip its extension 
done 

显然,在你自己的例子,当文件名包含空格或有多个扩展名(例如,Your File Test.cc.hpp),则会出现问题。

无论如何,这回避basename的呼叫,并不需要临时文件,如在其他两个答案;唯一的缺点是由于bash版本的要求,其可移植性有限。