rmdirは心配要らない


(ZAZ “Si jamais j’oublie” 「もし私が忘れるようなことがあったら」)
ドラマ『朝が来る』 の主題歌です。『朝が来る』の原作は読んでいませんが、読み終えた後に「朝がきた」と感じるらしく、感動は必至です。子供と生みの親、育ての親が登場してきます。まだ一話しか見ていなくて,ほとんど生みの親の話だけでしたので、感情は生みの親へ肩入れしながら2話目に期待しています。

切っても切れない親子の関係は、ディレクトリの階層にもあります。コマンドのオプションでは、mkdirとrmdirに-p(parents)オプションがあり、使いこなすと多階層のディレクトリの扱いが容易になります。

以下は、mkdir -pで複数階層のディレクトリを作成する例です。

~$ ls
~$
~$ mkdir -p `seq -s/ 10`
~$ find
.
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/2/3/4/5/6/7
./1/2/3/4/5/6/7/8
./1/2/3/4/5/6/7/8/9
./1/2/3/4/5/6/7/8/9/10
~$ 

rmdir -pはさきほどの逆で、

~$ rmdir !$
rmdir -p `seq -s/ 10`
~$ find
.
~$ 

全ディレクトリが消えましたね。

さて、mkdirがあるからrmdirがあるわけですが、もちろんrmでもディレクトリは消せます。rmdirがディレクトリだけの削除であることに対して、rmはディレクトリもファイルも消せます。そう考えると、コマンド体系としてどうなのかと思うかもしれません。しかし、rmdirは使えるコマンドです。
rmとrmdir、それぞれ使って比べてみましょう。

実験用に、多階層ディレクトリとファイルを作成します。

~$ ls
~$
~$ mkdir -p `seq -s/ 10`
~$ touch !$/file.txt
touch `seq -s/ 10`/file.txt
~$ find
.
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/2/3/4/5/6/7
./1/2/3/4/5/6/7/8
./1/2/3/4/5/6/7/8/9
./1/2/3/4/5/6/7/8/9/10
./1/2/3/4/5/6/7/8/9/10/file.txt
~$ 

rmで消して行きます。

~$ rm -r 1
~$ ls
~$ 

期待どおり、あっという間に消えてしまいました。

しかし、です。この深い階層のどこかのディレクトリに消してはならない重要なファイルがあるか分からない場合は、どうすれば良いでしょうか。rmだと、否応無く消されてしまいます。
そのような場合に、rmdirコマンドがあります。

rmdirを試すため、先ほど作ったディレクトリとファイルを再度作ります。historyに残ってるので活用しましょう。

~$ !mk;!to
mkdir -p `seq -s/ 10`;touch `seq -s/ 10`/file.txt
~$ find
.
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/2/3/4/5/6/7
./1/2/3/4/5/6/7/8
./1/2/3/4/5/6/7/8/9
./1/2/3/4/5/6/7/8/9/10
./1/2/3/4/5/6/7/8/9/10/file.txt
~$ 

rmdirを実行してみましょう。ディレクトリ中にファイルがあるので消せないはずです。
ディレクトリ内にサブディレクトリがある場合は、rmdir -pを使います。

~$ rmdir -p `seq -s/ 10`
rmdir: `1/2/3/4/5/6/7/8/9/10' を削除できません: ディレクトリは空ではありません
~$ 

file.txtが存在するため、消せませんでした。では、file.txtを消して同じことをしてみましょう。
以下のようにfile.txtを消して、

~$ find -name file.txt | xargs rm
~$ find
.
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/2/3/4/5/6/7
./1/2/3/4/5/6/7/8
./1/2/3/4/5/6/7/8/9
./1/2/3/4/5/6/7/8/9/10
~$ 

先ほど実行したrmdirを再び実行します。

~$ !rmdir
rmdir -p `seq -s/ 10`
~$ find
.
~$ 

見事にディレクトリが全部消えました。

では深い階層のディレクトリで、途中で枝分かれしているような場合はどうなるでしょうか。
以下のようなディレクトリで確認してみましょう。

~$ mkdir -p `seq -s/ 10`
~$ mkdir -p 1/2/AAA/BBB/CCC
~$ find
.
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/2/3/4/5/6/7
./1/2/3/4/5/6/7/8
./1/2/3/4/5/6/7/8/9
./1/2/3/4/5/6/7/8/9/10
./1/2/AAA
./1/2/AAA/BBB
./1/2/AAA/BBB/CCC
~$ 

数字のディレクトリがすべて消えるかrmdirを実行してみます。

~$ rmdir -p `seq -s/ 10`
rmdir: ディレクトリ `1/2' の削除に失敗しました: ディレクトリは空ではありません
~$ 

これも見事に1/2が残りました。1/2が消えてしまうとAAA/BBB/CCCも消えてしまうからです。
このようにrmdirは無心に使えるコマンド、ファイルの存在を「もし私が忘れるようなことがあったら」何も考えずに使えるコマンドです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA