シェルワンライナー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な値がリダイレクトされる
      • というコマンドになる。
  • | bash
    • パイプでsedで作ったコマンド文がbashに渡されて、実行される。

感想

  • 3日もあけてしまった。
  • 全然答えを自分で導ける気がしない。
  • manとかで読んで、このオプションね。とか
  • じゃあこれはなんでだろう?とかを自分で調べて補完し始めてきたので、ポジティブに捉えてコツコツ解いてみる。
  • 少なくとも20問ぐらいやってみて、振り返る感じかなぁ。