Skip to content

Instantly share code, notes, and snippets.

@yowasou
Created April 25, 2025 12:50
Show Gist options
  • Save yowasou/1f777cd46840d0e16e4e736554a1b787 to your computer and use it in GitHub Desktop.
Save yowasou/1f777cd46840d0e16e4e736554a1b787 to your computer and use it in GitHub Desktop.
# Civitaiのinfoファイルを使ってLoraを分類するコード
# プレビュー画像は取り直しなので注意
require 'json'
require 'fileutils'
# === 設定 ===
TARGET_DIR = 'C:\SD\webui\models\Lora\nofolder' # 対象のフォルダに書き換えてください
DEST_BASE_DIR = 'C:\SD\webui\models\Lora\copied' # 分類結果を保存するフォルダ
# === ステップ①: .infoと対応する.safetensorsファイルのペアを探す ===
info_files = Dir.glob(File.join(TARGET_DIR, "*.civitai.info"))
paired_files = info_files.map do |info_path|
base_name = File.basename(info_path, ".civitai.info")
safetensor_path = File.join(TARGET_DIR, "#{base_name}.safetensors")
File.exist?(safetensor_path) ? [info_path, safetensor_path] : nil
end.compact
# === ステップ② & ③: .infoファイルをJSONで読み込み、baseModelを抽出 ===
grouped_by_base_model = {}
paired_files.each do |info_path, safetensor_path|
info_text = File.read(info_path)
if info_text =~ /"baseModel"\s*:\s*"([^"]+)"/
base_model = $1
puts "baseModel: #{base_model}"
else
puts "baseModelが見つかりませんでした。"
base_model = "bunrui_hunou"
end
grouped_by_base_model[base_model] ||= []
grouped_by_base_model[base_model] << [info_path, safetensor_path]
end
# === ステップ④: baseModelごとにファイルを分類(コピー) ===
grouped_by_base_model.each do |base_model, files|
# フォルダ名に使えない文字を置き換える
safe_base_model = base_model.gsub(/[:\\\/\*\?"<>\|]/, '_')
dest_dir = File.join(DEST_BASE_DIR, safe_base_model)
FileUtils.mkdir_p(dest_dir)
files.each do |info_path, safetensor_path|
info_dest = File.join(dest_dir, File.basename(info_path))
tensor_dest = File.join(dest_dir, File.basename(safetensor_path))
unless File.exist?(info_dest)
FileUtils.cp(info_path, info_dest)
puts "コピー: #{File.basename(info_path)} -> #{dest_dir}"
else
puts "スキップ(存在済): #{File.basename(info_path)}"
end
unless File.exist?(tensor_dest)
FileUtils.cp(safetensor_path, tensor_dest)
puts "コピー: #{File.basename(safetensor_path)} -> #{dest_dir}"
else
puts "スキップ(存在済): #{File.basename(safetensor_path)}"
end
end
end
puts "分類完了。"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment