shell script 特定ディレクトリをスキップ
# スキップしたいディレクトリ名をスペース区切りで指定 skip_dirs="hoge piyo" # 現在のディレクトリ以下で、名前が '*.dir' にマッチするディレクトリを検索し、それぞれに対してループを実行 for path in $(find . -name '*.dir' -type d); do # path のベース名(ディレクトリ名)を取得 dir_name=$(basename "$path") # スキップ対象のディレクトリかどうかをチェック case " $skip_dirs " in *" $dir_name "*) continue ;; esac # coverage_report 以下に dir_name と同じ名前のディレクトリを作成 cov_dir="coverage_report/$dir_name" # カバレッジレポート用のファイル名を指定 cov_file="$cov_dir/unit_test.info" # cov_dir が存在しない場合は作成(エラーメッセージは無視) mkdir -p "./$cov_dir" > /dev/null 2>&1 # lcov コマンドを使ってカバレッジレポートを生成し、cov_file に保存 # lcov_branch_coverage=1 を指定して、ブランチカバレッジも含める lcov -d "$path" -c --rc lcov_branch_coverage=1 -o "./$cov_file" done
このスクリプトでは、skip_dirs変数にスキップしたいディレクトリ名をスペース区切りで追加することで、後から簡単にスキップ対象のディレクトリを追加できます。スキップ対象のディレクトリが増えた場合は、skip_dirs変数にディレクトリ名を追加してください。
追加要件に基づいて、スクリプトを変更しました。$dir_nameの1つ上のディレクトリ名がtoolの場合、処理をスキップします。
# 現在のディレクトリ以下で、名前が '*.dir' にマッチするディレクトリを検索し、それぞれに対してループを実行 for path in $(find . -name '*.dir' -type d); do # path のベース名(ディレクトリ名)を取得 dir_name=$(basename "$path") # 1つ上のディレクトリのパスを取得 parent_path=$(dirname "$path") # 1つ上のディレクトリの名前を取得 parent_name=$(basename "$parent_path") # 1つ上のディレクトリ名が "tool" の場合、処理をスキップ if [ "$parent_name" = "tool" ]; then continue fi # coverage_report 以下に dir_name と同じ名前のディレクトリを作成 cov_dir="coverage_report/$dir_name" # カバレッジレポート用のファイル名を指定 cov_file="$cov_dir/unit_test.info" # cov_dir が存在しない場合は作成(エラーメッセージは無視) mkdir -p "./$cov_dir" > /dev/null 2>&1 # lcov コマンドを使ってカバレッジレポートを生成し、cov_file に保存 # lcov_branch_coverage=1 を指定して、ブランチカバレッジも含める lcov -d "$path" -c --rc lcov_branch_coverage=1 -o "./$cov_file" done
はい、dirnameコマンドは、パスがディレクトリであってもファイルであっても使用できます。このコマンドは、指定されたパスから1つ上のディレクトリのパスを返します。dirnameコマンドはファイルやディレクトリを削除するわけではなく、指定されたパスの親ディレクトリのパスを出力するだけです。
例えば、以下のようにdirnameコマンドを使用できます。
$ dirname /home/user/documents/work/file.txt /home/user/documents/work $ dirname /home/user/documents/work/dir /home/user/documents/work
このスクリプトでは、$pathはディレクトリまでのパスが含まれています。dirnameコマンドを使って、そのディレクトリの1つ上のディレクトリのパスを取得しています。そして、その1つ上のディレクトリの名前をbasenameコマンドで取得しています。
# 現在のディレクトリ以下で、名前が '*.dir' にマッチするディレクトリを検索し、それぞれに対してループを実行 for path in $(find . -name '*.dir' -type d); do # path のベース名(ディレクトリ名)を取得 dir_name=$(basename "$path") # ディレクトリ階層に "tool" が含まれるかチェック if echo "$path" | grep -q "/tool/"; then # "tool" が含まれる場合、処理をスキップ continue fi # coverage_report 以下に dir_name と同じ名前のディレクトリを作成 cov_dir="coverage_report/$dir_name" # カバレッジレポート用のファイル名を指定 cov_file="$cov_dir/unit_test.info" # cov_dir が存在しない場合は作成(エラーメッセージは無視) mkdir -p "./$cov_dir" > /dev/null 2>&1 # lcov コマンドを使ってカバレッジレポートを生成し、cov_file に保存 # lcov_branch_coverage=1 を指定して、ブランチカバレッジも含める lcov -d "$path" -c --rc lcov_branch_coverage=1 -o "./$cov_file" done
このスクリプトでは、echo "$path" | grep -q "/tool/"を使って、ディレクトリ階層にtoolが含まれているかどうかをチェックしています。grep -qは、マッチする行がある場合には何も出力せず、終了ステータスでマッチの有無を返します。toolが含まれている場合、continueコマンドによって処理をスキップします。