1. ホーム
  2. Linux

【Linux】mkdir・rmdir・touch の使い方|ディレクトリとファイルを作成・削除する

Share

ターミナルで作業をしていると、「新しいディレクトリを作りたい」「空のファイルを1つ用意したい」「間違えて作ったディレクトリを消したい」といった場面が頻繁に出てきます。こうした基本操作を担うのが mkdirrmdirtouch の3つのコマンドです。名前どおり mkdir はディレクトリを作り、rmdir はディレクトリを削除し、touch はファイルを作成(または日時を更新)します。この記事では、単に作る・消すだけでなく、親ディレクトリをまとめて作る -p、空のファイルとタイムスタンプ更新という touch の二面性、そして「ディレクトリが消せない」とつまずきやすい rmdir の性質までを、実際のコマンドと出力を交えて解説します。GNU 版(Linux 標準)を前提に、macOS の BSD 版との違いにも触れていきます。

mkdir でディレクトリを作る

mkdir は「make directory(ディレクトリを作る)」に由来する名前です。作りたいディレクトリ名を引数に渡すだけで、その名前のディレクトリがカレントディレクトリに作られます。名前を複数並べれば、一度に複数のディレクトリを作ることもできます。

ターミナル
# work という名前のディレクトリを作る
$ mkdir work

# 一度に複数のディレクトリを作る
$ mkdir css js images
$ ls
css  images  js  work

ここで注意したいのは、mkdir は既定では「途中のディレクトリが存在すること」を前提にしている点です。たとえば project ディレクトリがまだ無い状態で mkdir project/src と打つと、親である project が見つからないためエラーになり、src は作られません。深い階層をいきなり作りたいときは、次に紹介する -p が必要になります。

ターミナル
# project がまだ無い状態で下の階層を作ろうとするとエラーになる
$ mkdir project/src
mkdir: cannot create directory 'project/src': No such file or directory

-p で親ディレクトリごとまとめて作る

-p(parents)を付けると、途中の親ディレクトリが存在しなくても、必要なものをすべてさかのぼって作ってくれます。mkdir -p project/src/components のように書けば、projectproject/srcproject/src/components が一気に用意されます。プロジェクトのひな形を作るときに欠かせないオプションです。

もう一つ、-p には「すでに存在するディレクトリを指定してもエラーにしない」という重要な性質があります。通常の mkdir は、同じ名前のディレクトリがすでにあると「File exists」というエラーで止まりますが、-p を付けておけば、あってもなくても静かに処理を続けます。シェルスクリプトの中で「無ければ作る、あればそのまま」という動きをさせたいときに、この性質がとても便利です。

ターミナル
# 途中の階層がなくても、親ごとまとめて作る
$ mkdir -p project/src/components
$ ls project/src
components

# すでにあるディレクトリを指定してもエラーにならない
$ mkdir -p project/src/components   # 2回目でも何も言われず正常終了する

ブレース展開で構造をまとめて作る

-p とシェルのブレース展開を組み合わせると、複数のディレクトリを1行で作れて非常に強力です。ブレース展開とは、{a,b,c} のように波かっこで区切って書くと、シェルがそれを a b c に展開してくれる仕組みのことです。たとえば mkdir -p project/{src,dist,docs} と打つと、シェルがこれを mkdir -p project/src project/dist project/docs に展開してから実行するため、project の下に srcdistdocs の3つが一度に作られます。

ターミナル
# project の下に src, dist, docs をまとめて作る
$ mkdir -p project/{src,dist,docs}
$ ls project
dist  docs  src

# 入れ子にして、より複雑な構造も一度に作れる
$ mkdir -p app/{src/{js,css},public,tests}

ブレース展開を行っているのは mkdir ではなくシェルである点は覚えておくとよいでしょう。この仕組みは mkdir 専用のものではなく、多くのコマンドで同じように使えます。なお、波かっこの中の要素の区切りにスペースを入れる({src, dist} のように書く)と意図どおり展開されないので、カンマの前後は詰めて書くようにしてください。

パーミッションを指定する -m と作成を表示する -v

-m(mode)を付けると、作成するディレクトリのパーミッション(権限)を chmod と同じ書き方で指定できます。mkdir -m 700 private とすれば、所有者だけが読み書き・移動できる private ディレクトリが作られます。指定しない場合は、環境ごとの umask の設定にもとづいた既定の権限になります。もう一つの -v(verbose、詳しく)は、作成したディレクトリを1つずつメッセージで報告してくれるオプションで、-p と併用すると「実際にどの階層が新しく作られたのか」が分かって安心です。

ターミナル
# 所有者だけがアクセスできる権限(700)でディレクトリを作る
$ mkdir -m 700 private
$ ls -ld private
drwx------  2 taro  staff  64  7  6 10:00 private

# 作成したディレクトリを報告させる(-p と併用)
$ mkdir -pv logs/2026/07
mkdir: created directory 'logs'
mkdir: created directory 'logs/2026'
mkdir: created directory 'logs/2026/07'

mkdir でよく使うオプションを、ここで一度まとめておきます。

オプション意味
-p親ディレクトリが無ければまとめて作る。すでに存在してもエラーにしない
-m モード作成するディレクトリのパーミッションを指定する(例: -m 755
-v作成したディレクトリを1つずつ報告する

rmdir で空のディレクトリを削除する

rmdir は「remove directory(ディレクトリを削除する)」の名前どおり、ディレクトリを削除するコマンドです。ただし大きな特徴があり、中身が空のディレクトリしか削除できません。ファイルやサブディレクトリが1つでも残っていると、rmdir は削除を拒否してエラーを返します。これは一見不便に思えますが、「うっかり中身ごと消してしまう」事故を防ぐための安全な仕様だと考えると理解しやすいでしょう。

ターミナル
# 空のディレクトリなら問題なく削除できる
$ mkdir empty
$ rmdir empty

# 中身があるディレクトリは削除できず、エラーになる
$ rmdir project
rmdir: failed to remove 'project': Directory not empty

-p で空の親をたどって削除する

rmdir にも -p(parents)があり、こちらは mkdir -p のちょうど逆の働きをします。指定したディレクトリを削除したあと、その親ディレクトリもさかのぼって空であれば順に削除していきます。たとえば rmdir -p logs/2026/07 と打つと、まず 07 を消し、2026 が空になったのでそれも消し、さらに logs も空なら消す、という具合に上へたどっていきます。途中で空でないディレクトリに行き当たった時点で処理は止まります。

ターミナル
# 空の階層をまとめて作ってから
$ mkdir -p logs/2026/07

# 空の親をたどって、logs まで一気に削除する
$ rmdir -p logs/2026/07
$ ls logs
ls: cannot access 'logs': No such file or directory

中身ごと消したいときは rm -r を使う

rmdir はあくまで空のディレクトリ専用なので、ファイルが入ったディレクトリをまるごと削除したいときには使えません。その場合は rm コマンドに -r(recursive、再帰的)を付けた rm -r を使います。rm -r project とすれば、project の中にあるファイルやサブディレクトリごと、まとめて削除できます。ただし rm -r は中身を確認せずに一気に消してしまうため、実行前にパスをよく確かめてください。rmdir が「空でないと消せない」という安全装置になっているのに対し、rm -r にはその歯止めがない、というのが両者の決定的な違いです。rm の詳しい使い方は別の記事で扱っているので、ここでは rmdir との違いにとどめておきます。

ターミナル
# 中身が入ったディレクトリをまるごと削除する
$ rm -r project

# rmdir は空ディレクトリ、rm -r は中身ごと、と使い分ける

touch で空ファイルを作る・日時を更新する

touch は、指定した名前のファイルが存在しなければ中身が空のファイルを新しく作り、すでに存在していればそのファイルのタイムスタンプ(日時情報)を現在時刻に更新するコマンドです。もともとは後者、つまり「ファイルに触れて(touch)更新日時だけを今にする」ことが本来の役目ですが、実際には「とりあえず空のファイルを1つ作る」用途で使う場面のほうが多いかもしれません。まずは空ファイルを作る使い方から見ていきます。

ターミナル
# 空のファイルを作る
$ touch index.html
$ ls -l index.html
-rw-r--r--  1 taro  staff  0  7  6 10:00 index.html   # サイズは 0 バイト

# 複数のファイルをまとめて作る
$ touch main.js style.css README.md

すでに存在するファイルに対して touch を実行すると、中身はそのままに、更新日時だけが現在時刻に書き換わります。ビルドツールが「更新日時を見て処理するかどうかを判断する」ような場面で、あえてファイルを touch して再ビルドを促す、といった使い方があります。

ターミナル
# 既存ファイルを touch すると、中身はそのままで更新日時が今になる
$ touch index.html
$ ls -l index.html
-rw-r--r--  1 taro  staff  0  7  6 11:30 index.html   # 時刻だけ更新された

時刻を指定する -t と -d、更新対象を選ぶ -a と -m

タイムスタンプは現在時刻ではなく、任意の日時に設定することもできます。-t[[CC]YY]MMDDhhmm[.ss] という形式の数字で時刻を指定するオプションで、たとえば -t 202607061200 なら「2026年7月6日12時00分」を表します。もう少し人間に読みやすい書き方をしたいときは -d(date)が便利で、-d "2026-07-06 12:00" のように文字列で日時を渡せます。

ファイルが持つ時刻情報には、実は「アクセス時刻(最後に読まれた日時)」と「更新時刻(最後に内容が変更された日時)」の2種類があります。touch は既定でこの両方を書き換えますが、-a(access)を付けるとアクセス時刻だけ、-m(modification)を付けると更新時刻だけを対象にできます。狙った時刻だけをピンポイントで変えたいときに使います。それぞれの意味を表にまとめます。

オプション意味
-t 時刻時刻を [[CC]YY]MMDDhhmm[.ss] 形式の数字で指定する
-d 文字列時刻を "2026-07-06 12:00" のような文字列で指定する
-aアクセス時刻だけを変更する
-m更新時刻だけを変更する
-cファイルが無くても新規作成しない(あれば時刻だけ更新)
ターミナル
# 時刻を数字で指定する(2026年7月6日 12時00分)
$ touch -t 202607061200 report.txt

# 時刻を読みやすい文字列で指定する
$ touch -d "2026-07-06 12:00" report.txt

# 更新時刻だけを、指定した日時に変更する
$ touch -m -d "2026-01-01 00:00" report.txt
$ ls -l report.txt
-rw-r--r--  1 taro  staff  0  1  1  2026 report.txt

-c で新規作成させない

ときには「そのファイルが存在するなら時刻を更新したいが、無いなら何もしてほしくない(新しく作りたくない)」ということがあります。そんなときは -c(no-create)を付けます。これを付けておくと、対象のファイルが存在しない場合、touch はファイルを作らずに黙って終了します。既存ファイルの日時だけを操作したいスクリプトなどで、意図しない空ファイルが増えるのを防げます。

ターミナル
# 存在しないファイルに -c を付けると、何も作られない
$ touch -c not-exist.txt
$ ls not-exist.txt
ls: cannot access 'not-exist.txt': No such file or directory

3つのコマンドの使い分け

最後に、3つのコマンドをどう使い分けるかを整理しておきます。ディレクトリを作りたいなら mkdir、深い階層やプロジェクトのひな形をまとめて作りたいなら mkdir -p(必要ならブレース展開と組み合わせる)を使います。ディレクトリを消したいときは、中身が空なら rmdir、中身が入っているなら rm -r を選ぶ、という判断になります。空かどうか分からず「とにかく消したい」場合は rm -r が確実ですが、中身ごと消える点には十分注意してください。そして、空のファイルを1つ用意したいときや、既存ファイルの更新日時だけを操作したいときは touch の出番です。

やりたいこと使うコマンド
ディレクトリを作るmkdir 名前
親ごと・複数階層をまとめて作るmkdir -p 親/子/孫
空のディレクトリを削除するrmdir 名前
中身ごとディレクトリを削除するrm -r 名前
空のファイルを作るtouch 名前
既存ファイルの日時を更新するtouch 名前(既存なら時刻更新)

GNU(Linux)と BSD(macOS)の違い

ここまで紹介した基本的な使い方は、Linux の GNU 版でも macOS の BSD 版でもほぼ共通です。mkdir -p-m-vrmdir -ptouch の空ファイル作成やタイムスタンプ更新は、どちらの環境でも同じ感覚で使えます。細かい違いとしては、-d で日時文字列を指定するときの受け付けられる書式が挙げられます。GNU 版はかなり柔軟な表現("1 hour ago" のような相対指定など)を解釈できますが、BSD(macOS)版の -d はより限定的な ISO 8601 に近い形式を前提とするため、GNU で通った書き方がそのままでは動かないことがあります。時刻を数字で厳密に指定する -t は両者で共通して使えるので、環境を問わず確実に動かしたいときは -t のほうが無難です。手元のコマンドがどのオプションに対応しているかは、man mkdirman touch でマニュアルを開いて確認するのが確実です。

まとめ

mkdirrmdirtouch は、ファイルとディレクトリを作ったり消したりするいちばん基本的なコマンドです。mkdir-p を覚えると、親ごとの作成や既存でもエラーにしない挙動、ブレース展開との組み合わせまで一気に世界が広がります。rmdir は「空のディレクトリしか消せない」という安全な性質を持ち、中身ごと消したいときは rm -r に切り替える、と役割を分けて考えるのがポイントです。touch は「無ければ空ファイルを作り、あれば日時を更新する」という二面性を持ち、-t-d での時刻指定、-c での新規作成の抑制まで押さえておくと、日々の作業やスクリプトで幅広く応用できます。細かい仕様や環境差に迷ったら、man で手元のマニュアルを確認する習慣をつけておくと安心です。

参考ページ