[python] Blu-ray Disc一杯に書きこみたい
- 2012.02.26
- 工作
最近、pythonの勉強をしたのでコードを書いてみた。
ちょっと会社で時間ができたから、pythonの本を読んでみてる
BDディスク一杯に書き込むために、フォルダ内からディスク容量一杯になるファイルとフォルダの組み合わせを見つける
Disc容量を一杯にする方法
・対象のファイルとフォルダは深さ0で、フォルダ内のファイルは一塊
・更新日時が古いファイルとフォルダから、容量が許すまで選択する
・上記選択での残り容量に入るファイルとフォルダの組み合わせを見つける
普段バックアップファイルを選択する手順をpythonコードにしてみた感じ
もっと頭のいい方法、アルゴリズムがあったら教えて欲しい[:パー:]
bd_backup.py
#!/usr/bin/python #vim: fileencoding=utf-8 import os,sys max_size = 25000000000 #byte max_combination = 5 class Bd(object): def __init__(self, target, max_size): self.folder = target self.max_size = max_size self.BackupList = [] def _getFolderSize(self, sInFdr): size=0 for root,dirs,files in os.walk(sInFdr): for f in files: size+=os.path.getsize(os.path.join(root,f)) return size def _sort_date(self, file_stat): return file_stat['date'] def _getDirList(self): listdir = [] for name in os.listdir(self.folder): tmp = {} fullpath = os.path.join(self.folder,name) if os.path.isdir(fullpath): tmp['size'] = self._getFolderSize(fullpath) tmp['name'] = fullpath + '/' else: tmp['size'] = os.path.getsize(fullpath) tmp['name'] = fullpath tmp['date'] = os.stat(fullpath).st_mtime listdir.append(tmp) listdir.sort(key=self._sort_date) return listdir[:] def _getRemainderList(self, rsize, listdir, max_comb): import itertools for fdata in listdir: if fdata['size'] > rsize: listdir.remove(fdata) comb = () for num in range(max_comb+1): diff = rsize for c in itertools.combinations(listdir,num): val = 0 for d in c: val+=d['size'] if val < rsize and rsize-val < diff: diff = rsize-val comb = c return list(comb) def getBackupList(self): listdir = self._getDirList() total_size=0 for fdata in listdir[:]: if total_size+fdata['size'] < self.max_size: total_size += fdata['size'] listdir.remove(fdata) self.BackupList.append(fdata) else: break if listdir != []: rlist = self._getRemainderList(self.max_size-total_size, listdir, max_combination) self.BackupList += rlist return self.BackupList if __name__ == '__main__': if len(sys.argv) !=2: print 'Usage: %s backup_folder' % sys.argv[0] quit() bd = Bd(sys.argv[1],max_size) for a in bd.getBackupList(): sys.stdout.write(a['name']+'\n')
バックアップするフォルダを引数にして実行すると、バックアップすべきファイルとフォルダが表示される
>python bd_backup.py /backup_folder
自分の使い方は
最後の行の
sys.stdout.write(a['name']+'\n') ↓ sys.stdout.write(a['name']+'\0')
にしてファイル名の空白に対応
>python bd_backup.py /backup_folder | xargs -0 mv -t /backup_temp
バックアップのテンポラリフォルダに移して、ライティングソフトに持っていく、焼き終わったそのフォルダごと削除
まだわかってないところがあると思うけど、とりあえず動くものはできた
書いてみて、ライン数が思ったより少なくて、C++erの自分としては驚いた、さすが流行りの言語だ[:にわとり:]
-
前の記事
ぽすれんを試してみた 2012.02.24
-
次の記事
US-144 MKⅱで低予算ドラム録り 2012.02.27