わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

外付けハードディスクのファイル数,200万から2万に

仕事場でのお話です.授業や研究で作ったファイルを,USB 3.0対応の2TBの外付けハードディスクに保存してきましたが,不調だなあと感じまして,6TBの外付けハードディスクを購入しました.まずはこれまでのデータを,新しいハードディスクにコピーしたいのですが,Windows環境で作業すると,つきっきりにならないといけません.少し考えて,Linux (Ubuntu)サーバに接続しました.
配線して少し待ち,「dmesg | tail」のコマンドで,/dev/sddと/dev/sdeに割り当てられているのを把握してから,コマンドを実行していきました.

$ sudo -i
# mkdir /mnt/{2,6}tb
# mount /dev/sdd1 /mnt/2tb
# mount /dev/sde1 /mnt/6tb
# df
# cd /mnt/2tb
# ls -l
# rsync -avz (2TBハードディスク内のフォルダ名) /mnt/6tb/

2時間くらいで終わってくれるといいなと思っていたら,半日近くかかりました.
ともあれ2TBのほうはお役御免です.「umount /mnt/2tb」でアンマウントしてから,/mnt/6tbにディレクトリを移し,lsやcdをしてみると,一つのディレクトリに2,126,979個の通常ファイルがあることが分かりました.一人の卒業生のデータだけで,百万を超えていますが,自分のバックアップにも,数万,数十万のファイルがありました.
削除するわけにもいかないので,アーカイブファイルに変換し,ファイル数を減らすことにしました.
そのコマンドもしくはフォーマットについて,zipもtarも好きでないので,少し調べたところ,7zが良さそうでした.ファイル名はUnicode対応とのことです.Ubuntuでは,「apt install p7zip p7zip-full」でインストールすれば使えます.Cygwin環境にも入っていまして,「7z a ディレクトリ名.7z ディレクトリ名」で,1個のファイルになることを確認し,「7z a -mx=9 ディレクトリ名.7z ディレクトリ名」とすれば圧縮率を高められる(出来上がりのファイルサイズを減らせる)ことも分かりました.「7z l ディレクトリ名.7z」の出力を見ると,どうやらパーミッションは保存されないようです.これについては,作業前に「ls -lR」を実行し,リダイレクトしてファイルに保存しておきました.
あとはちまちまと,コマンド実行をしていきました.上で「lsやcd」と書きましたが,一つのディレクトリに数万のファイルがある場合に,lsコマンドを実行すると,すぐに結果は返ってきません.かわりに「find ディレクトリ名 | wc -l」を活用しました.ディレクトリが占めるディスク容量を知るには「du -ks ディレクトリ名」です.「du -ks *」もたびたび実行しました.
いくつか,7zコマンドを直接実行したのち,ディレクトリ名をコマンドライン引数に与えれば,順に7zでファイルを作っていく,Bashスクリプトを作成しました.安全のためこのスクリプトでは,もとのディレクトリを削除しないこととし,代わりに出力の最終行に,このコマンドで実行できますよ,と,「/bin/rm -Rf アーカイブしたディレクトリ名の並び」を表示するようにしました.
別の仕事の合間に,端末を見て実行するようにして,2日かけて変換を完了しました.アンマウントしてWindows環境で接続し,プロパティを見ると,「ファイル数: 26,098」となっていました.