メモ
やりたいことを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を除く)と相対パスが取得され、カレントディレクトリにそれぞれのディレクトリが作成されます。
grep -o '[^/]*\.dir'
sed 's/\.dir$//'
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
のディレクトリ名に置き換えられ、相対パスが抽出されます。
- このコマンドは、入力文字列(ここではディレクトリパス)から
これらの grep
と sed
コマンドを組み合わせることで、ディレクトリパスから末尾が .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