tuneoの日記: filefragの出力がどうもイケてない件 5
ファイルサーバの中の共有ディレクトリの中の「ひどく断片化しているファイル」に限ってdefrag(btrfs filesystem defragとかxfs_fsrとか)を実行したいと思った。
ファイルがいくつのエクステントに分かれているかはfilefragでわかるんだからfind /home/tuneo -type f -exec filefrag "{}" \;でディレクトリ全体をナメた出力をsortに渡せばいいんでないかい?とお気楽に考え始めたのだが(↓の出力例は適当にでっちあげています)。
/home/tuneo/Music/CLANNAD/The Magical Ring/Theme from Harry's Game.flac: 12 extents found
みたいな具合にペロッと出力されてくるエクステント数をどう始末したものか頭を抱えている始末。ファイル名とエクステント数の区切り文字が:なんだけど、これは変更不能なんだよな。:はfilefragに渡されるファイル名の中にも含まれ得るのにそりゃないぜ!
……俺の乏しいあいてー技術で解決策を考えてみた。
Pythonおよび類似のスクリプト言語を使えば簡単だ。ファイル名の中に:が含まれていても右からfilename, extents = ':'.rsplit(line)で分割してint(re.sub(extents,r'[^0-9]*',''))で数値にすれば問題ない。あとはstdoutに垂れ流してsortに渡すもよし、(ファイル名, エクステント数)というタプルのリストを作ってsort()するなり、リスト内包で断片化がしきい値を越えてるファイルだけピックアップするもよし……めんどくさいけど。
さらに脱線。「そういえばfind -print0をPythonスクリプトに食わせる綺麗な方法ってあるのかな?」とふと思って調べてみたが、どうも無いっぽいなぁ。
一度ファイルに保存しちゃえば? (スコア:1)
わざわざワンライナーしなくても、一度、/tmp/tmp-$$って感じでファイルに結果を保存してから、スクリプト処理すればいいじゃん
Re:一度ファイルに保存しちゃえば? (スコア:1)
問題は「filefragが出力するメッセージの機械可読性があまりよろしくないこと」なので、ワンライナーにしようが一時ファイルに落とそうがまったく差は無いのですが……。
正規表現はもったいない (スコア:1)
int(line.split()[-3])
で良いのでは。
Re:正規表現はもったいない (スコア:1)
その手がありましたね!
Re:正規表現はもったいない (スコア:1)
ついでにファイル名に : が含まれている対応
filename = line.rsplit(': ', 1)[0]