0

C++在一个名为src. 我需要找到所有具有*Test.cc. 但没有.cc文件类型的文件,所以它只是[filename]Test. 我目前有:

  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. 我怎样才能做到这一点?

4

3 回答 3

3

在第 4 行和第 5 行之间插入这一行将导致 bash 代码段产生所需的输出:

f=$(basename $f .cc)
于 2013-05-22T03:29:04.253 回答
2

您可以使用这一行命令来完成此操作:

首先是将其存储在文件中以供参考:

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

然后打印它,或者它取决于你想对文件做什么:

cat samp.txt | while read i; do echo `basename $i .cc`; done;
于 2013-05-22T05:08:32.820 回答
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 版本要求,它的可移植性有限。

于 2013-05-22T08:33:48.027 回答