しぐまろぐ

勉強したことや読んだ本について書きます。

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

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

ファイル内に10と書かれたファイルのみ削除する。

準備

まずファイル内に数字を書き込んだファイルを1000個作る。

$ seq 1000 | sed 's/^/echo $RANDOM > /' | bash
  • $RANDOM : Bashの変数(第2章で扱うらしい)
  • echo $RANDOM > : この後に1~1000までの数字が来て、それをファイル名にしたファイルができ、中に$RANDOMの数字が書き込まれる。

なぜこれだけでファイルができるか理解するのにちょっと時間がかかったが、リダイレクトしているからだ。「$ echo "HELLO" > test.txt」で、中に"HELLO"と書かれたtest.txtができるのと同じ。

解答(誤答)

$ grep 10 | xargs rm

まずgrep部分まで実行した時点で処理が終わらず。。

正答

$ grep -l '^10$' -R | xargs rm
  • lオプション:検索結果を表示せずにファイル名だけを出力する。
  • Rオプション:ディレクトリの中のファイルを再帰的に読み込む。

上記の解答では、Rオプションがないから処理が終わらなかったと思う(理由はわからない。ファイル数がそこまで多いわけじゃないので、Rオプションなしでもそれほど時間がかからなそうな気がするんだけど......)。
→ 2023.01.05追記:処理が終わらなかった理由について、カツニャリ (id:papiro)さんにコメントでご教示いただきました。ありがとうございました!

Rオプションなしで明示的にカレントディレクトリ以下の全ディレクトリを指定しても処理できた(参考サイト参照)。

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