Created
April 25, 2025 12:50
-
-
Save yowasou/1f777cd46840d0e16e4e736554a1b787 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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