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し、他の2つの回答のように一時ファイルを必要としません。唯一の欠点は、bash のバージョン要件のために移植性が限られていることです。

于 2013-05-22T08:33:48.027 に答える