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つのディレクトリを作成するコマンド- 上記のディレクトリをすべて削除するコマンド