2017-06-18 12 views
0

EDITを使用してディレクトリ内のすべてのソースファイルを読む:私は、LinuxのFedoraに22クラン3.8 C++ - LibTooling

を使用しています私は、CPPのソースファイルを読み取るASTを解析して、いくつかを行うにはクラン3.8 LibToolingのlibを使用しています抽出したデータIに対する処理。 1つのファイルのコマンドラインや入力として与えられた複数のファイルを使用して私のツールを呼び出すと、すべてが機能します。

しかし、数十または数百のファイルがある場合、それらを何度も繰り返し書き込むことは不可能になります。だから、それに対抗する方法はありますか?たとえば、すべてのソースファイル名をtxtファイルにダンプし、ツールの入力として与えて、Clangのコマンドラインパーサーが指定されたパスやその他の方法でファイルを読み込むことを期待していますか?例えば

これは正常に動作します:

toolname f1.cpp f2.cpp -- 

しかし、どのようにすべてのファイル名を与えることなくこれを行うには:

toolname f1.cpp .......f1000.cpp -- 

答えて

1

それは重要な部分だとあなたは、オペレーティングシステムについての情報を与えるべきです。

ディレクトリは処理したいファイルがあるディレクトリへのパスです
toolname $(find directory -name "*.cpp") -- 

:あなたは、Linuxにしていると仮定すると、

は、次の試してください。

$(...)はlinuxのシェル構文です。それは、かっこの間にあるものを起動し、その完了後に$(...)のテキスト全体をコマンドの標準出力に置き換えます。 findは、指定された条件(例:-nameが指定されています - ディレクトリを無視するファイルの名前は* .cppパターンと一致する必要があります)で一致するファイルをディレクトリとそのサブディレクトリで検索します。

toolname $(find /home/q -name "*.cpp") -- 

はサブコマンド

find /home/q -name "*.cpp" 

この意志出力

を起動します

を起動

/home/q/a.cpp 
/home/q/a.h 
/home/q/b.cpp 

:だから仮定ディレクトリは/ホーム/ Qになり、三つのファイルがあるようになるだろう

/home/q/a.cpp 
/home/q/b.cpp 

(それは-nameパターンに一致doesntのようああは無視されます)、これは元のコマンドに戻されます:あなたは、たとえば、Pythonスクリプトを使用できるWindowsの場合

toolname /home/a.cpp /home/b.cpp -- 

import os, sys, subprocess 

toolname = os.path.abspath(sys.argv[1]) 
path = os.path.abspath(sys.argv[2]) 
args = [toolname] 
for name in os.listdir(path): 
    if name.endswith('.cpp'): 
    args.append(os.path.join(path, name)) 
sys.exit(subprocess.call(args)) 

ここで、最初の引数はツールへのパスで、ファイルへの2番目のパスは再帰的ではありません。

+0

OS情報を提供していないのは本当に残念です。はい、私はLinuxを使用しています。ありがとう。私はそれを試して、アップデートを投稿します。 –

+0

魅力的な作品です。助けてくれてありがとう! :) –

関連する問題