mkdir と rmdir でディレクトリを操作する
この記事は、シリーズ 機械学習エンジニアのためのLinux の第11回です。
概要
前回の記事までで、 コマンドを組み合わせて複雑な処理ができるという Linux コマンドラインの特徴を紹介した。
今回からは、ファイルとディレクトリの操作を行うコマンドを紹介する。
この記事では、ディレクトリの操作に必要な mkdir
と rmdir
という2つのコマンドを紹介しよう。
mkdir
: 空のディレクトリを作成する
mkdir
は、空のディレクトリを作成するコマンドだ。
Windows や Mac OS では、エクスプローラや Finder を使って空のフォルダを作ることができるが、Linux コマンドラインでは mkdir
が同じ働きをする。
$ mkdir <作成するディレクトリのパス>
例えば、ホームディレクトリ直下に secret_images
というディレクトリを作成したい場合は、次のようなコマンドを実行すればいい。
$ mkdir ~/secret_images
$ ls ~
secret_images ダウンロード デスクトップ ビデオ ミュージック
snap テンプレート ドキュメント ピクチャ 公開
複数のディレクトリパスを渡せば、一度に複数のディレクトリを作成することもできる。
secret_documents
と secret_videos
という2つのディレクトリを作成してみよう。
$ mkdir ~/secret_documents ~/secret_videos
ちなみに、すでに存在するディレクトリを作成しようとすると、mkdir
はエラーを返す。
$ mkdir ~/secret_images
mkdir: ディレクトリ `/home/yumemio/secret_images' を作成できません: ファイルが存在します
-p
オプション: 親ディレクトリも作成する
mkdir
には -p
オプションという便利なオプションがある。
これを使うと、次の2つのことが起こる。
- 作成するディレクトリの親ディレクトリなど、上位(祖先)のディレクトリが存在しない場合は、自動的に上位のディレクトリも作成する
- 作成しようとしたディレクトリが存在する場合も、エラーにならない
例えば、~/my_diary/2023
というディレクトリを作成したいとしよう。
オプションなしの mkdir
コマンドでは、~/my_diary
ディレクトリが存在しなければ ~/my_diary/2023
を作成できない。
$ mkdir ~/my_diary/2023
mkdir: ディレクトリ `/home/yumemio/my_diary/2023' を作成できません: そのようなファイルやディレクトリはありません
-p
オプションをつけると、必要な上位ディレクトリ(my_diary
)も自動的に作成してくれる。
$ mkdir -p ~/my_diary/2023
$ ls ~/my_diary
2023
このオプションは、build/var/lib/jenkins/workspace
のような深い階層をもつディレクトリ構造を作成するときに、特に便利だ。
📔 ノート
一部の環境ではブレース展開 (brace expansion) という機能を使って、たくさんのディレクトリを一気に作成することができる。「ブレース」というのは中括弧 (
{}
) のことだ。たとえば、
train/annotations
とval/annotations
というディレクトリを作成したいとしよう。$ mkdir -p train/annotations val/annotations
上記のように書いてもよいのだが、2つのパスに共通する
/annotations
という文字を2回書く必要があり面倒だ。これを、ブレース展開を使った形に書き直してみよう。
$ # このコマンドは、1つ前のコマンドと等価 $ mkdir -p {train,val}/annotations
すっきりした見た目になった。
このようにカンマ区切りで項目を羅列すると、引数が各項目と他の部分の組み合わせに展開されてからコマンドが実行される。
{train,val}
はtrain
とval
{train,val,test}_images
はtrain_images
,val_images
,test_images
に展開される、というわけだ。
さらに、
{始点..終点}
のようにピリオド2つを使うと、連続する番号やアルファベットのディレクトリ名を作成できる。
{0..127}
は0
,1
, …,127
{a..z}
はa
,b
, …,z
に、それぞれ展開される。
複数のブレース展開を組み合わせることも可能だ。 例えば、次のコマンドは
train
とval
ディレクトリのそれぞれの下にclass_1
、class_2
、…、class_99
ディレクトリを作成する。$ mkdir -p {train,val}/class_{1..99}
rmdir
: 空のディレクトリを削除する
mkdir
の対極に位置するのが rmdir
コマンドだ。mkdir
が空のディレクトリを作成するのに対し、rmdir
は空のディレクトリを削除する。
rmdir
の使い方も mkdir
とそっくりだ。次のように、引数としてディレクトリパスを渡す。
$ rmdir <削除するディレクトリのパス>
例えば、先ほど作成した ~/secret_images
ディレクトリを削除したい場合は、次のようにする。
$ rmdir ~/secret_images
注意点として、ディレクトリが空でない、つまりファイルや他のディレクトリが入っている場合は rmdir
で削除できない。
中身のファイルごと削除する場合は、第13回の記事で紹介する rm -r
を使う必要がある。
$ # rmdir は空でないディレクトリを削除できない
$ ls ~/secret_videos
anime geiger_conter.m4a toys.m4a
$ rmdir ~/secret_videos
rmdir: 'secret_videos/' を削除できません: ディレクトリは空ではありません
-p
オプション: 空の親ディレクトリも削除する
rmdir
にも -p
オプションがある。
-p
オプションをつけると、指定したパスに含まれるすべてのディレクトリを削除することができる。
ただし、空でないディレクトリや、ユーザが削除する権限のないディレクトリは削除できない。
先ほど作成した ~/my_diary/2023
ディレクトリを削除してみよう。
$ cd ~
$ # 削除する前のホームディレクトリ
$ ls
my_diary ダウンロード デスクトップ ビデオ ミュージック
snap テンプレート ドキュメント ピクチャ 公開
$ # rmdir で削除
$ rmdir -p my_diary/2023
$ # 削除した後のホームディレクトリ
$ ls
snap テンプレート ドキュメント ピクチャ 公開
ダウンロード デスクトップ ビデオ ミュージック
my_diary
ディレクトリと 2023
ディレクトリがどちらも削除された。
📔 ノート
rmdir -p
コマンドは、パスに含まれるすべてのディレクトリの削除を試みる。 このため、相対パスを使う場合と、絶対パスを渡す場合とのあいだで、微妙な違いが生まれることがある。上記の例では
my_diary/2023
のように相対パスを指定したが、rmdir -p ~/my_diary/2023
のように絶対パスを指定すると、どうなるだろう。$ rmdir -p ~/my_diary/2023 rmdir: ディレクトリ '/home/yumemio' の削除に失敗しました: 許可がありません $ ls ~ snap テンプレート ドキュメント ピクチャ 公開 ダウンロード デスクトップ ビデオ ミュージック
my_diary
ディレクトリは削除できたが、「/home/yumemio
が削除できない」というエラーメッセージが表示された。 なぜエラーが起こるのだろう。これは、
rmdir -p
がパスに含まれるすべてのディレクトリを削除しようとするからだ。先ほどの例で、相対パスを指定してディレクトリを削除した場合、パスに含まれるディレクトリは
my_diary
と2023
の2つだ。rmdir -p my_diary/2023
を実行すると、これら2つのディレクトリが階層の深いものから削除されていく。$ # このコマンドは... $ rmdir -p my_diary/2023 $ # このコマンドと等価 $ rmdir my_diary/2023 $ rmdir my_diary
一方、絶対パスを
rmdir
に渡す場合、~
は/home/yumemio
(ユーザ名がyumemio
の場合) と解釈される。このため、絶対パス版の
rmdir -p
はhome
、yumemio
、my_diary
、2023
の4つのディレクトリを削除しようとする。 しかし、ホームディレクトリである/home/yumemio
は通常のユーザ権限では削除できない。 このため、先ほどのようなエラーになってしまう。$ # このコマンドは... $ rmdir -p ~/my_diary/2023 $ # このコマンドと等価であり... $ rmdir -p /home/yumemio/my_diary/2023 $ # このコマンドとも等価 $ # (実際には /home/yumemio が削除できず、エラー終了する) $ rmdir /home/yumemio/my_diary/2023 $ rmdir /home/yumemio/my_diary $ rmdir /home/yumemio $ rmdir /home
まとめ
今回は、ディレクトリの作成に使う mkdir
コマンドと、ディレクトリを削除する rmdir
コマンドについて紹介した。
大量のファイルを扱う機械学習分野では、適切なディレクトリ構造を作成してファイルを保存することが重要だ。 今回紹介したコマンドを使えば、思いどおりにディレクトリを作成・削除することができるはずだ。
次回以降の記事では、ファイルの移動やコピー、削除などの操作について紹介しよう。 特に「大量のファイルを効率よく操作する」ことを焦点にあてて、各種コマンドの説明をしていく予定だ。
それでは、次回の記事もお楽しみに!
🎯 まとめ
mkdir
: 空のディレクトリを作成するコマンド
mkdir ~/my_diary
: ホームディレクトリにmy_diary
ディレクトリを作成する-p
オプション: 上位のディレクトリも作成する。ディレクトリが既に存在する場合もエラーにならない。rmdir
: 空のディレクトリを削除するコマンド
rmdir ~/my_diary
:~/my_diary
ディレクトリを作成する-p
オプション: パスに含まれるすべてのディレクトリを削除する。ただし、ディレクトリが空でなければエラーになる。
❓ 練習課題
- 次の操作をするコマンドを作成してみよう。
/tmp/mycache
というディレクトリを作成するコマンド。/tmp
ディレクトリは既にあると仮定してよい。- ホームディレクトリに
experiment/0001/result/images
とexperiment/0002/result/images
という2つのディレクトリを作成するコマンド- 上記のディレクトリをすべて削除するコマンド