Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題4

問題4 特定のファイルの削除

ランダムな数字がひとつ書き込まれたファイルを大量に作り、その中から数字の10が書かれたファイルのみを削除する問題だった。10を含むのではなく、ちょうど10が書いてあるファイルのみを探す、ということ。最初は問題の規模を小さくしてやってみようとしたが100程度ではちょうど10を含むファイルが生成される確率が低いせいで出力が何も得られず、何が悪いのかさっぱりわからずずいぶん苦戦した。ランダムな数字は0~32767までの範囲なのでせめて10万くらいのファイルは作るべきだったと反省している。

最初はlsでファイルの一覧を出した後catで中身を出してそれからgrepでチェックすればいいと思い、やってみたところlsの出力をcatにパイプで渡すとき何かがおかしいようでcatがちゃんとファイルの中身を出してくれなかった。仕方がないのでcat $(ls)としてやってみたが今度は中身とファイル名の対応がつかなくなり、削除ができないとわかったので結局この方法はあきらめて解答を見ることにした。

まず

seq 1000000 | sed 's/^/echo $RANDOM > /' | bash

でランダムな数字がひとつ書き込まれたファイルを100万個生成する。私の環境では約7分もかかった。このワンライナーの意味は次のとおりである。まずseqで数字の列を生成した後、その数字の先頭にecho $RANDOM > を書き加えた文字列をsedで作ることで、各番号に対してecho $RANDOM > number という文字列を生成できる。あとはこれをbashに投げればランダムな数字の書き込まれたファイルが出来上がる(リダイレクト先のファイル名が存在しないものだった場合、確かその名前のファイルを新たに生成する仕様になっていたはず。どこのマニュアルに書いてあるのか思い出せない)。次に

grep -l '^10$' -R | xargs rm

を実行して削除する。削除には約4分半かかった。