メモ

やりたいことをchatgptにきいた。 後で記事にするためまとめ直す。

以下のスクリプトでは、find コマンドを使って、*.gcno ファイルを検索し、結果を配列 find_output に格納しています。

#!/bin/bash

# find コマンドで *.gcno ファイルを検索
find_output=($(find . -name '*.gcno'))

# 各ディレクトリパスを処理
# for path in "${find_output[@]}"; do # コマンド直接書いちゃうと下記。

  # ディレクトリパスから末尾が '.dir' のディレクトリ名を抽出
  dir_name_with_ext=$(echo "${path}" | grep -o '[^/]*\.dir')

  # '.dir' を除いたディレクトリ名を取得
  dir_name=$(echo "${dir_name_with_ext}" | sed 's/\.dir$//')

  # .dirのディレクトリ名までの相対パスを別の変数に格納
  relative_path=$(echo "${path}" | sed "s/\(.*\)${dir_name_with_ext}.*/\1${dir_name_with_ext}/")

  # .dir を除いたディレクトリ名でカレントディレクトリにディレクトリを作成
  mkdir -p "./${dir_name}"

  echo "ディレクトリ名(.dirを除く): ${dir_name}"
  echo "相対パス: ${relative_path}"
  echo "-----"
done

このスクリプトを実行すると、find コマンドで検索された各ディレクトリパスに対して、ディレクトリ名(.dirを除く)と相対パスが取得され、カレントディレクトリにそれぞれのディレクトリが作成されます。

  1. grep -o '[^/]*\.dir'
    • このコマンドは、入力文字列(ここではディレクトリパス)から末尾が .dir の部分文字列を抽出します。
    • o オプションは、一致した部分文字列のみを出力します。
    • 正規表現 [^/]*\.dir は、以下を意味します。
      • [^/]:スラッシュ / 以外の任意の文字
      • ``:直前の文字が0回以上繰り返される
      • \.dirリテラル.dir 文字列
    • この正規表現は、スラッシュ以外の文字が0回以上繰り返され、最後に .dir が続く部分文字列に一致します。
  2. sed 's/\.dir$//'
    • このコマンドは、入力文字列(ここでは末尾が .dirディレクトリ名)から .dir を取り除きます。
    • s/パターン/置換/パターン に一致する部分を 置換 で置き換える
    • 正規表現 \.dir$ は、以下を意味します。
      • \.dirリテラル.dir 文字列
      • $:文字列の末尾
    • この正規表現は、文字列の末尾に .dir がある部分に一致します。
    • 置換部分が空文字列なので、一致した部分(.dir)が削除されます。
  3. sed "s/\(.*\)${dir_name_with_ext}.*/\1${dir_name_with_ext}/"
    • このコマンドは、入力文字列(ここではディレクトリパス)から .dirディレクトリ名までの相対パスを抽出します。
    • s/パターン/置換/パターン に一致する部分を 置換 で置き換える
    • 正規表現 \(...\):カッコ内の部分に一致する部分をキャプチャ(後で参照できる)
    • .*:任意の文字が0回以上繰り返される
    • この正規表現は、任意の文字列(キャプチャされる)と、末尾が .dirディレクトリ名に一致します。
    • 置換部分は \1${dir_name_with_ext} で、\1 は最初のキャプチャグループ(任意の文字列)を参照し、${dir_name_with_ext} は末尾が .dirディレクトリ名を参照します。
    • 結果として、一致した部分(ディレクトリパス全体)が、キャプチャされた任意の文字列と末尾が .dirディレクトリ名に置き換えられ、相対パスが抽出されます。

これらの grepsed コマンドを組み合わせることで、ディレクトリパスから末尾が .dirディレクトリ名を抽出し、.dir を取り除いたディレクトリ名を取得し、.dirのディレクトリ名までの相対パスを別の変数に格納しています。


指定された find コマンドを使用して、*.dir のディレクトリを検索し、相対パスをそのまま利用するように修正しました。以下が修正されたシェルスクリプトです。

#!/bin/bash

# find コマンドで *.dir ディレクトリを検索
find_output=($(find . -name '*.dir' -type d))

# 各ディレクトリパスを処理
for path in "${find_output[@]}"; do
  # ディレクトリパスから末尾が '.dir' のディレクトリ名を抽出
  dir_name_with_ext=$(basename "${path}")

  # '.dir' を除いたディレクトリ名を取得
  dir_name=$(echo "${dir_name_with_ext}" | sed 's/\.dir$//')

  # .dirのディレクトリ名までの相対パスをそのまま利用
  relative_path="${path}"

  # .dir を除いたディレクトリ名でカレントディレクトリにディレクトリを作成
  mkdir -p "./${dir_name}"

  echo "ディレクトリ名(.dirを除く): ${dir_name}"
  echo "相対パス: ${relative_path}"
  echo "-----"
done

#!/bin/bash

# find コマンドで *.dir ディレクトリを検索
find_output=($(find . -name '*.dir' -type d))

# 各ディレクトリパスを処理
for path in "${find_output[@]}"; do
  # ディレクトリパスから末尾が '.dir' のディレクトリ名を抽出
  dir_name_with_ext=$(basename "${path}")

  # '.dir' を除いたディレクトリ名を取得
  dir_name=$(echo "${dir_name_with_ext}" | sed 's/\.dir$//')

  # .dirのディレクトリ名までの相対パスをそのまま利用
  relative_path="${path}"

  # .dir を除いたディレクトリ名でカレントディレクトリにディレクトリを作成
  mkdir -p "./${dir_name}"

  # lcov コマンドで .info ファイルを作成
  lcov --capture --directory "${path}" --output-file "./${dir_name}/coverage.info"

  echo "ディレクトリ名(.dirを除く): ${dir_name}"
  echo "相対パス: ${relative_path}"
  echo "-----"
done