「/(スラッシュ)」の使い方を調べてみた
CLIを使うようになってから、これまで様々なコマンドを打ってきました。
コマンドやオプションが分からない時にネットで調べることはありますが、大体のそこに付いてくる「/(スラッシュ)」は調べたことないなぁと思いました。
そこで、各コマンドにおける「/」の動作について、自分の復習も兼ねて調べてみました。
事前準備
色々なコマンドを実行するので、(最悪壊れても大丈夫な)環境をVirtualBoxで作成しました。
OSは普段使用しているCentOS7にしました。
「ls」コマンドに使用する「/」
「ls」はファイルを一覧表示する際に使用するコマンドです。
user01というユーザーのホームディレクトリ直下に以下のディレクトリ構成を用意しました。
[user01@localhost ~]$ tree ←ディレクトリやファイルをツリー状に表示 . └── dir1 ├── file1 ├── file2 ├── file3 ├── dir2 │ ├── file4 │ ├── file5 │ └── file6 └── dir3 ├── file7 ├── file8 └── file9 3 directories, 10 files
dir2の中が見たい時に、そのパスを指定するのに「/」が使われます。(「/」無しでもディレクトリの中身が表示されます)
[user01@localhost ~]$ ls dir1/dir2/ file4 file5 file6
[user01@localhost ~]$ ls dir1/dir2 ←「/」無しでも結果は同じ file4 file5 file6
また、「/」を先頭に指定することでルートディレクトリ(最上位のパス)を表示することが出来ます。
[user01@localhost ~]$ ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
「rsync」コマンドに使用する「/」
「rsync」はファイルやディレクトリをコピー(同期)する際に使用するコマンドです。
user01というユーザーのホームディレクトリ直下に以下のディレクトリ構成を用意しました。
[user01@localhost ~]$ tree . └── dir1 └── file1 1 directory, 1 file
dir1をdir2としてコピーする際に「/」の有無で結果が変わってきます。
「/」無しの場合
[user01@localhost ~]$ rsync -av dir1 dir2 [user01@localhost ~]$ tree . ├── dir1 │ └── file1 └── dir2 └── dir1 └── file1 3 directories, 2 files
「/」有りの場合
[user01@localhost ~]$ rsync -av dir1/ dir2 [user01@localhost ~]$ tree . ├── dir1 │ └── file1 └── dir2 └── file1 2 directories, 2 files
コピー元のディレクトリに「/」が付いていない場合、ディレクトリごとコピー先のディレクトリにコピーされます。
コピー元のディレクトリに「/」が付いている場合は、コピー元のディレクトリの中身のみがコピー先のディレクトリにコピーされます。
ちなみに、コピー先のディレクトリの指定においては「/」の有無で結果は変わりません。
[user01@localhost ~]$ rsync -av dir1/ dir2 [user01@localhost ~]$ tree . ├── dir1 │ └── file1 └── dir2 └── file1 2 directories, 2 files
[user01@localhost ~]$ rsync -av dir1/ dir2/ ←コピー先の指定に「/」があっても結果は変わらない [user01@localhost ~]$ tree . ├── dir1 │ └── file1 └── dir2 └── file1 2 directories, 2 files
大量のファイルが入ったディレクトリをコピーしたい時に、「/」を付けてしまうと中身がばら撒かれてしまいます。
[user01@localhost ~]$ tree . ├── dir1 │ └── dir2 │ ├── file1 │ ├── file2 │ ├── file3 │ └── file4 └── dir3
上記のdir2をディレクトリごとdir3直下にコピーしたい時に
. ├── dir1 │ └── dir2 │ ├── file1 │ ├── file2 │ ├── file3 │ └── file4 └── dir3 └── dir2 ├── file1 ├── file2 ├── file3 └── file4
↑このような構造にしたいのに…
「/」を付けてしまうと…
[user01@localhost ~]$ rsync -av dir1/dir2/ dir3/ [user01@localhost ~]$ tree . ├── dir1 │ └── dir2 │ ├── file1 │ ├── file2 │ ├── file3 │ └── file4 └── dir3 ├── file1 ├── file2 ├── file3 └── file4
↑ファイルがdir3の直下に展開されてしまう
「/」の有無で結果が変わってくるので、自分の意図にあったコピーが出来るように注意が必要です。
「rm」コマンドに使用する「/」
「rm」はファイルやディレクトリを削除する際に使用するコマンドです。
「/」の意味は、「ls」コマンドと同様にパスを指定する際に使用されます。
[user01@localhost ~]$ tree . └── dir1 ├── file1 ├── file2 └── file3 ↓file3を削除する場合 [user01@localhost ~]$ rm dir1/file3 [user01@localhost ~]$ tree . └── dir1 ├── file1 └── file2
しかし、「rm」コマンドでは「/」の使い方に注意が必要で、危険なコマンドとして有名(?)なものがあります。
rm -rf /*
このコマンドの意味は【ルートディレクトリ以下全てのディレクトリ、ファイルを強制的に削除する】というものです。
先述の「ls /」で表示されたディレクトリはOSやコマンドが動作するのに必要なファイルが多数入っているので、これらが消えてしまうとOSが破壊され起動しなくなります。
ただ、ルートディレクトリ以下は管理者ユーザー(root)でないと削除できないため、このコマンドは管理者ユーザーでの実行が危険となります。
「/」だけの場合、警告メッセージが出てきて危険なコマンドであることを知らせてくれる [user01@localhost ~]$ rm -rf / rm: `/' に関して再帰的に操作することは危険です rm: このフェイルセーフを上書きするには --no-preserve-root を使用してください
「sed」コマンドに使用する「/」
「sed」は文字列の置換や抽出、削除などのテキスト処理に使用するコマンドです。
基本的な使い方は以下の通りです。区切り文字として「/」が登場します。
sed 's/置換前文字列/置換後文字列/g' ファイル名 [user01@localhost ~]$ cat sample.txt one,two,three.four,five,six,seven,eight,nine,ten ←文字列の書いてあるファイルを用意 [user01@localhost ~]$ sed -i 's/ten/10/g' sample.txt ←tenを10に置換、-iのオプションを付けることで置換したものに上書きできる [user01@localhost ~]$ cat sample.txt one,two,three.four,five,six,seven,eight,nine,10
ちなみに、区切り文字として「/」が登場していますが、実際には違う文字でも区切り文字として使用できます。
[user01@localhost ~]$ cat sample.txt one,two,three.four,five,six,seven,eight,nine,10 [user01@localhost ~]$ sed -i 's$five$5$g' sample.txt ←fiveを5に置換 [user01@localhost ~]$ cat sample.txt one,two,three.four,5,six,seven,eight,nine,10
また、置換したい文字列の中に「/」が入ってるけど、区切り文字として絶対に「/」が使いたいという強情な人の場合、文字列の「/」の前に「\」を付けることで文字として認識してくれます。
[user01@localhost ~]$ cat sample.txt one/two/three/four/five/six/seven/eight/nine/ten [user01@localhost ~]$ sed -i 's/\//,/g' sample.txt ←「/」を「,」に置換 [user01@localhost ~]$ cat sample.txt one,two,three,four,five,six,seven,eight,nine,ten
終わりに
危険なコマンド…OS破壊…仮想環境…
やってみました。
[user01@localhost ~]$ sudo rm -rf /* 略) rm: `/sys/module/nf_conntrack_ipv6/refcnt' を削除できません: 許可されていない操作です rm: `/sys/module/nf_conntrack_ipv6/uevent' を削除できません: 許可されていない操作です rm: `/sys/module/nf_conntrack_ipv6/holders' を削除できません: 許可されていない操作です
いくつかのファイルがパーミッションの関係で削除されませんでしたが「ls」が使えなくなっているなど既に異常なことになっています。
[user01@localhost ~]$ ls -bash: /usr/bin/ls: No such file or directory
VirtualBoxのシャットダウンシグナルにも反応しなくなりシャットダウン出来ないので、強制的に終了させてから再起動してみると…
OSまでたどり着かず起動しませんでした。

非常に危険なコマンドということが分かりましたので、「rm」コマンドには細心の注意を払うようにしましょう。
そもそも、このコマンド(rm -rf /*)が必要になる場面ってあるのでしょうか?
ファブリカコミュニケーションズで働いてみませんか?
あったらいいな、をカタチに。人々を幸せにする革新的なサービスを、私たちと一緒に創っていくメンバーを募集しています。
ファブリカコミュニケーションズの社員は「全員がクリエイター」。アイデアの発信に社歴や部署の垣根はありません。
“自分から発信できる人に、どんどんチャンスが与えられる“そんな環境で活躍してみませんか?ご興味のある方は、以下の採用ページをご覧ください。