0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Text File Archiving with Bash

Last updated at Posted at 2024-08-01

gitリポジトリからテキストファイルだけを抜き出して単一のテキストとして出力するbashスクリプトです。

stat ではなく gstat を使っているところに注意してください。

archive_and_process.bash
#!/bin/bash

current_dir=$PWD

# 一時ディレクトリの作成
temp_dir=$(mktemp -d)

# リポジトリ名の取得
repo_name=$(basename `git rev-parse --show-toplevel`)

# 現在のリポジトリをtar形式でアーカイブ
git archive -o "$temp_dir/repo_archive.tar" HEAD

# アーカイブを展開
mkdir -p "$temp_dir/$repo_name"
tar -xf "$temp_dir/repo_archive.tar" -C "$temp_dir/$repo_name"

# 展開したディレクトリに移動
cd "$temp_dir/$repo_name"

# バイナリファイルかどうかを判定する関数
is_binary_file() {
  local file="$1"
  local file_output
  file_output=$(file "$file")

  if [[ "$file_output" == *"text"* ]]; then
    return 1  # テキストファイルの場合
  else
    return 0  # バイナリファイルの場合
  fi
}

# フォルダ名の取得
folder_name=$(basename "$PWD")

# 出力ファイル名を設定
output_file="${folder_name}.txt"

# 出力ファイルを新規作成または上書き
> "$output_file"

# find コマンドの出力を取得し、ファイルに保存
echo "## Find Output" | tee -a "$output_file"
find . -type f -exec ls -lh {} \; | tee -a "$output_file"

# ソースコードセクションの開始
echo "## Source Code" | tee -a "$output_file"

# find コマンドを使用してすべてのファイルを取得
find_output=$(find . -type f)

while IFS= read -r line; do
  if [[ $line != "./$output_file" ]] && ! is_binary_file "$line"; then
    file_size=$(gstat -c%s "$line")
    if (( file_size <= 10240 )); then
      {
        echo "\`\`\`file:$line"
        cat "$line"
        echo "\`\`\`"
        echo
      } | tee -a "$output_file"
      echo "Processed: $line"
    else
      echo "Ignored (file too large): $line"
    fi
  else
    [[ $line == "./$output_file" ]] && echo "Ignored (output file): $line" || echo "Ignored (binary file): $line"
  fi
done <<< "$find_output"

# 出力ファイルサイズのセクション
output_file_size=$(gstat -c%s "$output_file")
echo "## Output File Size" | tee -a "$output_file"
echo "Output file size: $output_file_size bytes" | tee -a "$output_file"

# 標準出力への出力ではなくファイルを生成したい場合はこの行を使ってください。
# mv $output_file $current_dir

# 一時ディレクトリの削除
rm -rf "$temp_dir"

元ネタは ChatGPTにgitのリポジトリ渡すと全ソースコード.txtをダウンロードさせてくれるやつ〜〜〜〜(AIに食わせるコード一覧が欲しい時用) です。 git archive してるとこを除けばほとんどそのまままです。kazuphさんありがとうございます。

「ほぼ手動でやるなら.sh実行もローカルでやって、.txtだけAIに食わせれば良いだけのような……。」というブックマークコメントを見て「もっともだ」と思ったので作りました。

あと archive_and_process.bash という名前はChatGPT-4oに考えさせたんですけど、いかにもダサいので良い名前があったらご教示ください:bow_tone1:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?