3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

-rを削除して

Last updated at Posted at 2021-05-22

-rを削除して!

ある日, いつものように友人と雑談をしていたところ, ふと「Dovahaちゃん, これもlinuxあるあるなんだけれど, "-r"って名前のファイルを削除できる???」って言われた.
これが僕の10分くらいの苦労の始まりだった.

ここで一旦ストップ. 自分自身でも"-r"って名前のファイルを作って削除してみよう.

結論

  • オペランドにハイフン付きのを指定するのは難しい
  • 様々なコマンドの-rのオプションに詳しくなれるね.
  • ファイルオペランドに./-rとして指定してあげる方法で-rを指定できる.
  • オプションに--を指定するとハイフン付きファイル名が指定できるようになる.

"-r"を削除するために, まず"-r"を作ろう

ファイルを削除するためにはまずは作らないといけない.

touch -r

中身のないファイルを作るために使われるコマンドと言えば,touchである.
というわけで,

$ touch -r

をするわけだが,

$ touch -r
touch: option requires an argument -- 'r'
Try 'touch --help' for more information.

と出てきた.
どうやら,touchにおける-rオプションというのはファイルのタイムスタンプを合わせるためのコマンドらしい.

$ touch -r fileB fileA

とコマンドを打つとfileAのタイムスタンプがfileBとそろうらしい.
そりゃあ引数を必要とするって怒られるわけだ.

linux環境外で作成する(番外)

自分が利用しているlinux環境がWSLであるため, ファイルシステムにwindows側からアクセスができる.(というか, linuxホームからwindowsのDocumentにシンボリックリンクを貼って普段はそこで作業を行っている.)

じゃあ作業している領域にwindowsのエクスプローラーでアクセスして-rというファイルを作ればいいわけだ!!!となるわけだ.

ってことで作った.
が, linuxでどうしてもいじることができない.それに邪道感が半端ないのでwindowsのexploreで削除を行った.

リダイレクト

友人から, ヒントをもらった.
作るだけならリダイレクトをすると簡単に作れるよ!とのアドバイスをもらった.

ということで作ってみる.

$ last > -r
$ ls
-r

意外とあっさりできてしまった.

ふとこのファイルの中身を気になって

$ less -r

としてみると,

$ less -r
Missing filename ("less --help" for help)

と怒られた.

こいつにも-rオプションがあるのかと怒られて調べてみると, ANSI Color Escape Sequenceを色表示するオプションらしい.
つまるところ, コードに色を付けられる?のかな?
ということで, ちょっと研究室のwwwサーバーにアクセスして確認してきた.

うーん, どちらも黒いままだ……. ということでまた今度調べることに.

とりあえず, "-r"というファイルを作れたので削除を頑張る.

"-r"を削除しよう.

ワイルドカードを使ってみよう

ファイルの削除をしたいのなら, そりゃもちろんrmでしょ. ということでrmを使おうとする.

だが, ここでDovaha君は賢いので気が付いた!!-rオプションは再帰的に削除(ディレクトリごと削除できる!)するためのオプションだからオプション判定されてきっとrm :オペランドがありませんって怒られるだけになっちゃうと!

なので頭がいいDovaha君はディレクトリ内のモノを*を用いて一斉に削除することに!!

$ ls
-r
$ rm *
rm: missing operand
Try 'rm --help' for more information.

なんでオペランドが無いって怒られるの……?どうして……(´・ω・`)

ここでワイルドカードの動作を考えてみよう.

  1. コマンドとして実行される前にワイルドカードが展開される.
  2. 展開されて"-r"が出てくる.
  3. 実行されるのはrm -rになる.

ダメじゃん.というわけです.
このままだと削除ができない!と困ってしまうわけですね.

ここまでのまとめ

  • -rを直接コマンドの後に書くとオプションとして認識される.
  • *でワイルドカード展開を行うと-rが展開された後にコマンドが走るのでオプションとして認識される.

-rの示し方

とりあえず削除するためにディレクトリごと消すというのを試していたところ, ふと気が付いた.
「あれ?これ, ディレクトリの中の-rなら指定できるのじゃない???と」
というわけで試してみる.

~/test$ ls
-r
~/test$ pwd
/home/USER/test
~/test$ rm ./../test/-r
~/test$ ls
~/test$

できた!!!
どうやら, ファイルオペランドにオプションとして認識できないものをいれればいいみたい!!!

じゃあ……カレントディレクトリの-rも削除できるんじゃ?となるわけです.

~/test$ last > -r
~/test$ ls
-r
~/test$ rm ./-r
~/test$ ls
~/test$ 

これもできた!!となるとファイルの作成も削除もこれで出来るね!

~/test$ touch ./-r
~/test$ ls
-r
~/test$ rm ./-r
~/test$ ls
~/test$ 

というわけです.

正攻法は??

どうやらこれは友人の想定していた方法ではないらしい.

友人の想定は,--オプションを使うというもの
これを使うと?

$ touch -- -r
$ ls
-r
$ rm -- -r
$ ls
$ 

いや!こんなの知らなきゃできるか!!!!

というわけでした.

おわり

3
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?