あまり使うことは無さそうですが、RailsのActiveStorageで管理しているファイルを、S3からローカル(disk)に移しました。
やり方を忘れないようにメモ。
ディレクトリ構造
S3では、ファイルはSU61LeyW6YcZtZaoNHSL2CTu
のような名前でbucketに格納されています。
ローカルのディレクトリに置く場合は、storage/SU/61/SU61LeyW6YcZtZaoNHSL2CTu
のようになっています。つまり、2階層のディレクトリが作られていて、1階層目はファイル名の先頭の2文字、2階層目は3文字目と4文字目がディレクトリ名になっています。
手順
S3からファイルをコピーする
tmpの下のstorageというディレクトリにコピーします。
$ mkdir tmp/storage
$ aws s3 cp s3://<bucket-name> ./tmp/storage --recursive
ActiveStorageのディレクトリに移す
次のRubyスクリプトで2階層のディレクトリを作りながらコピーします。
アプリケーションのルートディレクトリで実行します。
require 'fileutils'
src = "tmp/storage"
dst = "storage"
Dir.glob("#{src}/**/*").each do |source|
next unless File.file?(source)
file = File.basename(source)
dir1, dir2, = file.scan(/\A(?<dir1>..)(?<dir2>..)/).flatten
target = "#{dst}/#{dir1}/#{dir2}/#{file}"
FileUtils.mkdir_p(File.dirname(target)) unless File.exist?(File.dirname(target))
FileUtils.cp(source, target)
puts target
end
後始末
コピーしてきたファイルや、作業用のディレクトリを削除します。