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コマンドによって処理をスキップします。