シェルワンライナー160本ノック: 問題4
問題
まず、ランダムな数字が入ったファイルをたくさん作る
$ mkdir ./tmp $ cd ./tmp $ seq 1000000 | sed 's/^/ echo $ RANDOM > /' | bash
これで1000000個のファイルが作成され、各ファイルに0-32767のうち一つの整数がランダムに記述されている。という状態ができる
このファイルの中から10という数字が書かれているファイルを削除する。
答え
まずは対象ファイルのみを出力してみる
$ grep -l '^10$' -R
-l
オプション- 一致する行が見つかった場合、ファイル名のみを出力する。デフォルトでは、一致する行の内容も出力されるが、このオプションを使用するとファイル名のみが表示される。
'^10$
^
は先頭の意味。$
は末尾の意味。なので行は10
のみが書かれているかどうか。ということ
-R
- 検索対象のディレクトリが何も指定されていないが、もし何も指定されない場合GNU grepではカレントディレクトリが指定されるらしい。
このコマンドで消したいファイル名が抽出できるので、これをxargsで繋いでrmコマンドを叩けばOK
$ grep -l '^10$' -R | xargs rm
解説
■問題でやっていること
seq 1000000
- 1 - 1000000まで繰り返し整数を生成
sed 's/^/echo $RANDOM >/'
- sedコマンドを使って、入力された各行の先頭に、
echo $RANDOM >
を追加する - 即ち、各行は
echo $RANDOM > [seqで生成される数値]
ということになる。- 「seqで生成される数値」が名前のファイルにRANDOMな値がリダイレクトされる
- というコマンドになる。
- sedコマンドを使って、入力された各行の先頭に、
| bash
感想
- 3日もあけてしまった。
- 全然答えを自分で導ける気がしない。
- manとかで読んで、このオプションね。とか
- じゃあこれはなんでだろう?とかを自分で調べて補完し始めてきたので、ポジティブに捉えてコツコツ解いてみる。
- 少なくとも20問ぐらいやってみて、振り返る感じかなぁ。