- サーバー
Linux mkdir・touchの使い方|-pで階層作成と空ファイル作成
mkdirはディレクトリ(フォルダ)を作るコマンド、touchは空ファイルを作る(正確にはファイルの時刻を更新する)コマンドです。 深い階層を一度に作りたいときは mkdir -p、中身のないファイルをすぐ用意したいときは touch ファイル名 と覚えておけば、日々の作業の大半はまかなえます。
この記事では、2つのコマンドの全オプションを早見表にまとめ、すべての例に実行結果(ls -l・tree の出力やエラー文)を付けました。 File exists、No such file or directory、Permission denied の3つのエラーは実際に再現して、原因と直し方を並べています。ブレース展開での一括作成、「階層ごとファイルを作る」ワンライナー、touch と > の違い、macOS との差も表で確認できます。
検証環境は Ubuntu 24.04 LTS、GNU coreutils 9.4(mkdir・touch)、bash 5.2.21 です。macOS(BSD版)の欄だけは手元で動かしていないため、「未実行」と明記しています。
mkdir・touchの早見表
やりたいことから選ぶ
| やりたいこと | コマンド | ポイント |
|---|---|---|
| ディレクトリを1つ作る | mkdir app |
同名があると File exists |
| 深い階層を一度に作る | mkdir -p app/src/main/java |
途中の親も作る。既にあってもエラーにならない |
| 作った階層を表示しながら作る | mkdir -pv logs/2026/10 |
作成したものを1行ずつ表示 |
| 権限を指定して作る | mkdir -m 700 secret |
chmod と同じ書き方が使える |
| 複数まとめて作る | mkdir -p site/{css,js,img} |
ブレース展開(シェルの機能) |
| 空白を含む名前で作る | mkdir "my docs" |
引用符で囲む |
| 空ファイルを作る | touch memo.txt |
既にあれば時刻だけ更新(中身はそのまま) |
| 複数の空ファイルを作る | touch file{1..3}.log |
連番もブレース展開で |
| 階層ごとファイルを作る | mkdir -p a/b && touch a/b/c.txt |
touch は親ディレクトリを作らない |
| 無ければ作らず、あれば時刻だけ更新 | touch -c file |
新規作成を止める |
| 更新時刻を指定の日時にする | touch -d "2026-01-15 09:30" file |
文字列で日時を指定 |
| 別ファイルと同じ時刻にする | touch -r 元ファイル 対象 |
時刻をコピー |
mkdir のオプション一覧(GNU coreutils 9.4)
| オプション | 長い形式 | 働き |
|---|---|---|
-p |
--parents |
途中の親ディレクトリも作る。既に存在してもエラーにしない |
-m モード |
--mode=モード |
権限を指定して作る(700 や u=rwx,g=rx,o=) |
-v |
--verbose |
作成したディレクトリを1つずつ表示する |
-Z |
--context[=CTX] |
SELinux のセキュリティコンテキストを設定する |
| なし | --help / --version |
ヘルプ/バージョン表示 |
touch のオプション一覧(GNU coreutils 9.4)
| オプション | 長い形式 | 働き |
|---|---|---|
-a |
--time=atime |
アクセス時刻(atime)だけを変える |
-m |
--time=mtime |
更新時刻(mtime)だけを変える |
-c |
--no-create |
ファイルが無いときに新しく作らない |
-d 文字列 |
--date=文字列 |
現在時刻の代わりに、指定した日時を使う |
-t スタンプ |
なし | [[CC]YY]MMDDhhmm[.ss] 形式で日時を指定する |
-r ファイル |
--reference=ファイル |
指定ファイルの時刻をそのまま使う |
-h |
--no-dereference |
シンボリックリンクそのものの時刻を変える |
-f |
なし | 何もしない(互換のために残っている) |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linux mkdir・touchの使い方|-pで階層作成と空ファイル作成」
mkdirでディレクトリを作る
基本:1つ作って ls -l で確かめる
mkdir app
ls -ld app
drwxr-xr-x 2 root root 4096 Oct 3 00:55 app
先頭の d がディレクトリの印です。権限が rwxr-xr-x(755)になるのは、umask が 022 だからです。 mkdir は「777 から umask を引いた権限」で作ります。umask を 077 に変えると次のようになります。
umask # 現在の値を表示
umask 077
mkdir um
ls -ld um
022
drwx------ 2 root root 4096 Oct 3 00:55 um
深い階層を一度に作る(-p)
親ディレクトリがまだ無い状態で深いパスを指定すると、エラーになります。
mkdir app/src/main/java
mkdir: cannot create directory ‘app/src/main/java’: No such file or directory
-p を付けると、途中の src と main も合わせて作ってくれます。
mkdir -p app/src/main/java
tree app
app
└── src
└── main
└── java
4 directories, 0 files
-p にはもう1つ働きがあります。既に存在するディレクトリを指定してもエラーにならず、終了ステータスも 0 のままです。
mkdir -p app ; echo "exit=$?"
exit=0
シェルスクリプトで「無ければ作る」を書くとき、if [ ! -d app ]; then mkdir app; fi の代わりに mkdir -p app の1行で済みます。
作った内容を表示する(-v)
mkdir -pv logs/2026/10
mkdir: created directory 'logs'
mkdir: created directory 'logs/2026'
mkdir: created directory 'logs/2026/10'
-p と組み合わせると、新しく作られた階層だけが表示されます。既にあった階層は表示されないので、どこから作られたかがひと目でわかります。
権限を指定して作る(-m)
mkdir -m 700 secret
mkdir -m u=rwx,g=rx,o= shared
ls -ld secret shared
drwx------ 2 root root 4096 Oct 3 00:55 secret
drwxr-x--- 2 root root 4096 Oct 3 00:55 shared
数字(700)でも記号(u=rwx,g=rx,o=)でも指定できます。mkdir のあとに chmod を打つ2手順が1手順になります。
-p と -m を一緒に使うときは、権限が付く範囲に気を付けます。 指定した権限が付くのは最後のディレクトリだけで、途中の親は umask どおりに作られます。
mkdir -p -m 700 p1/p2/p3
ls -ld p1 p1/p2 p1/p2/p3
drwxr-xr-x 3 root root 4096 Oct 3 00:55 p1
drwxr-xr-x 3 root root 4096 Oct 3 00:55 p1/p2
drwx------ 2 root root 4096 Oct 3 00:55 p1/p2/p3
親も含めて 700 にしたいときは、(umask 077; mkdir -p p1/p2/p3) のように、かっこの中で umask を一時的に変えると全階層が 700 になります(かっこを抜けると umask は元に戻ります)。
空白やハイフンで始まる名前を作る
mkdir "my docs" # 1つのディレクトリ「my docs」
mkdir my docs2 # 「my」と「docs2」の2つ
ls -d my*
my
my docs
(docs2 は my* に当てはまらないので表示されていませんが、作成されています。)空白を含む名前は引用符で囲む、と覚えておくと取り違えがなくなります。
ハイフンで始まる名前はオプションと解釈されます。-- を置くと「ここから先はオプションではない」という意味になります。
mkdir -- -p
ls -d -- -p
-p
ブレース展開でまとめて作る
{a,b,c} や {1..3} はブレース展開と呼ばれるシェル(bash・zsh)の機能です。mkdir や touch に渡る前に、シェルが複数の引数に広げます。
横に並べる・入れ子にする
mkdir -p site/{css,js,img}
tree site
site
├── css
├── img
└── js
4 directories, 0 files
入れ子にすると、ひな形の構成を1行で作れます。
mkdir -p proj/{src/{main,test},docs,config}
tree proj
proj
├── config
├── docs
└── src
├── main
└── test
6 directories, 0 files
カンマの前後に空白を入れないのがコツです。{css, js} と書くと展開されず、{css, と js} という名前が作られます。
連番で作る
mkdir -v day{01..03}
mkdir: created directory 'day01'
mkdir: created directory 'day02'
mkdir: created directory 'day03'
{01..03} のようにゼロを付けて書くと、桁をそろえた連番になります。
ブレース展開の早見表
| 書き方 | 展開結果 |
|---|---|
mkdir -p site/{css,js,img} |
site/css site/js site/img |
mkdir -p proj/{src/{main,test},docs} |
proj/src/main proj/src/test proj/docs |
mkdir day{01..03} |
day01 day02 day03 |
touch file{1..3}.log |
file1.log file2.log file3.log |
touch t/{a,b,c}/.gitkeep |
t/a/.gitkeep t/b/.gitkeep t/c/.gitkeep |
mkdir -p {dev,stg,prod}/{logs,conf} |
3×2=6個のディレクトリ |
どう展開されるか不安なときは、先頭に echo を付けて echo mkdir -p site/{css,js,img} と打つと、実行せずに展開結果だけを確認できます。
touchで空ファイルを作る
基本:サイズ0のファイルができる
touch memo.txt
ls -l --time-style=long-iso memo.txt
-rw-r--r-- 1 root root 0 2026-10-03 00:55 memo.txt
サイズの欄が 0 になっています。これが空ファイルです。複数まとめて作ることもできます。
touch a.txt b.txt c.txt
touch file{1..3}.log
ls *.log
file1.log
file2.log
file3.log
既にあるファイルに touch すると中身は残る
touch の本来の役目は「時刻の更新」です。 ファイルが無いときに空で作るのは、その副作用にあたります。そのため、既にあるファイルに touch しても中身は変わりません。
echo "important" > keep.txt
touch keep.txt
wc -c keep.txt
10 keep.txt
10バイト(important と改行)のまま残っています。ディレクトリに対して touch した場合も、ディレクトリの更新時刻が変わるだけです。
無ければ作らない(-c)
touch -c ghost.txt
ls ghost.txt
ls: cannot access 'ghost.txt': No such file or directory
-c を付けると、存在するファイルの時刻だけを更新し、無いファイルは作りません。 エラーも出ず、終了ステータスは 0 です。スクリプトで「あれば時刻を進める」処理を書くときに使えます。
touchで時刻を変える(-d・-t・-a・-m・-r)
Linux のファイルには3つの時刻があります。
| 名前 | 意味 | ls で見る | touch で変えられるか |
|---|---|---|---|
| atime(アクセス時刻) | 最後に読んだ時刻 | ls -lu |
変えられる(-a) |
| mtime(更新時刻) | 最後に中身を書き換えた時刻 | ls -l |
変えられる(-m) |
| ctime(状態変更時刻) | 権限や名前などが変わった時刻 | ls -lc |
指定できない(操作した現在時刻になる) |
GNU coreutils の公式マニュアル(touch invocation)にも、touch では ctime を任意の値に設定できないと書かれています。
日時を文字列で指定する(-d)
echo hello > data.txt
touch -d "2026-01-15 09:30:00" data.txt
stat -c "atime=%x | mtime=%y | ctime=%z" data.txt
cat data.txt
atime=2026-01-15 09:30:00.000000000 +0900 | mtime=2026-01-15 09:30:00.000000000 +0900 | ctime=2026-10-03 00:55:46.406000165 +0900
hello
atime と mtime が指定した日時になり、ctime だけは操作した時刻(現在)になっています。 中身の hello はそのままです。
GNU 版の -d は相対的な表現も受け付けます。
touch -d "yesterday" y.txt
touch -d "2 days ago" z.txt
touch -d "next monday" n.txt
ls -l --time-style=long-iso y.txt z.txt n.txt
date "+%F %T"
-rw-r--r-- 1 root root 0 2026-10-05 00:00 n.txt
-rw-r--r-- 1 root root 0 2026-10-02 00:55 y.txt
-rw-r--r-- 1 root root 0 2026-10-01 00:55 z.txt
2026-10-03 00:55:46
find -mtime や find -newer の動きを試すためのテスト用ファイルを作るときに便利です。
数字だけで指定する(-t)
touch -t 202512312359.30 data.txt
ls -l --time-style=full-iso data.txt
-rw-r--r-- 1 root root 6 2025-12-31 23:59:30.000000000 +0900 data.txt
書式は [[CC]YY]MMDDhhmm[.ss] です。202512312359.30 は「2025年12月31日 23時59分30秒」を表します。秒の前はピリオドです。-t は macOS(BSD)でも同じ書式で使えるため、両方の環境で動かすスクリプトに向いています。
片方の時刻だけ変える(-a・-m)
touch -a -d "2026-02-01 00:00" data.txt
stat -c "atime=%x mtime=%y" data.txt
touch -m -d "2026-03-01 12:00" data.txt
stat -c "atime=%x mtime=%y" data.txt
atime=2026-02-01 00:00:00.000000000 +0900 mtime=2025-12-31 23:59:30.000000000 +0900
atime=2026-02-01 00:00:00.000000000 +0900 mtime=2026-03-01 12:00:00.000000000 +0900
1回目は atime だけ、2回目は mtime だけが変わっています。mkdir -m は権限、touch -m は更新時刻と、同じ -m でも意味が違う点に気を付けます。
別のファイルと同じ時刻にする(-r)
touch -r data.txt memo.txt
ls -l --time-style=long-iso data.txt memo.txt
-rw-r--r-- 1 root root 6 2026-03-01 12:00 data.txt
-rw-r--r-- 1 root root 0 2026-03-01 12:00 memo.txt
memo.txt の更新時刻が data.txt と同じになりました。ファイルを編集したあとに元の時刻へ戻したいときは、編集前に touch -r 対象 /tmp/stamp で時刻を控えておき、編集後に touch -r /tmp/stamp 対象 で戻せます。
日時の書式が違うとき
touch -d "2026-13-01" bad.txt
touch -t 2026 bad.txt
touch: invalid date format ‘2026-13-01’
touch: invalid date format ‘2026’
13月のように存在しない日付や、桁が足りない -t は invalid date format になります。-d は「読める日時の文字列」、-t は「決まった桁数の数字」と使い分けます。
階層ごとファイルを作るワンライナー集
touch には mkdir の -p にあたるオプションがありません。親ディレクトリが無いと次のようになります。
touch nodir/x.txt
touch: cannot touch 'nodir/x.txt': No such file or directory
mkdir -p と touch を && でつなぐのが基本形です。&& は「前のコマンドが成功したら次を実行する」という意味です。
コピペ用ワンライナー
# 1. 基本形:階層を作ってからファイルを作る
mkdir -p rel/1.0 && touch rel/1.0/notes.md
# 2. パスを1回だけ書く(dirname で親を取り出す)
f=out/2026/10/report.csv; mkdir -p "$(dirname "$f")" && touch "$f"
# 3. 複数のディレクトリに同じ名前の空ファイルを置く
mkdir -p t/{a,b,c} && touch t/{a,b,c}/.gitkeep
# 4. ループで「ディレクトリ+README」をまとめて作る
for d in alpha beta; do mkdir -p "w/$d" && touch "w/$d/README.md"; done
# 5. 今日の日付の階層を作る
mkdir -p "bk/$(date +%Y/%m/%d)"
# 6. 日付入りの空ファイルを作る
touch "log_$(date +%Y%m%d).txt"
# 7. 作ってそのまま移動する
mkdir -p x/y && cd x/y
# 8. 一覧(1行に1つ)からディレクトリを作る
printf "one\ntwo three\n" | xargs -d "\n" mkdir -pv
# 9. install コマンドで親ごと空ファイルを作る(GNU)
install -D /dev/null inst/a/b/empty.txt
実行結果
1・2・3 の結果を tree で確かめます。
$ tree rel
rel
└── 1.0
└── notes.md
2 directories, 1 file
$ tree out
out
└── 2026
└── 10
└── report.csv
3 directories, 1 file
$ tree -a t
t
├── a
│ └── .gitkeep
├── b
│ └── .gitkeep
└── c
└── .gitkeep
4 directories, 3 files
.gitkeep のようにドットで始まるファイルは、tree -a(または ls -a)で表示されます。Git は空のディレクトリを記録しないため、空ディレクトリを残したいときにこの形がよく使われます。
4・5・6・8 の結果です。
$ find w -type f | sort
w/alpha/README.md
w/beta/README.md
$ find bk -type d
bk
bk/2026
bk/2026/10
bk/2026/10/03
$ ls log_*
log_20261003.txt
$ printf "one\ntwo three\n" | xargs -d "\n" mkdir -pv
mkdir: created directory 'one'
mkdir: created directory 'two three'
8 は -d "\n" で区切りを改行だけにしているので、空白を含む two three も1つのディレクトリになります。
9 の install -D は、作られるファイルの権限が 755(実行可能)になります。
$ ls -l inst/a/b
total 0
-rwxr-xr-x 1 root root 0 Oct 3 00:55 empty.txt
通常のテキスト用なら install -D -m 644 /dev/null パス と権限を添えるか、1 や 2 の形を使うと揃います。
関数にしておく
よく使うなら、~/.bashrc に関数を1つ足しておくと touchp a/b/c.txt と打つだけで済みます。
# 親ディレクトリごと空ファイルを作る
touchp() {
for f in "$@"; do
mkdir -p "$(dirname "$f")" && touch "$f"
done
}
# ディレクトリを作ってそのまま移動する
mkcd() { mkdir -p "$1" && cd "$1"; }
touchと「>」「: >」の違い
空ファイルを作る方法は touch 以外にもあります。違いが出るのは「既にファイルがあったとき」です。同じ 10 バイトのファイルに対して、それぞれ実行して比べました。
echo "important" > keep.txt; touch keep.txt; wc -c keep.txt
echo "important" > keep.txt; > keep.txt; wc -c keep.txt
echo "important" > keep.txt; : > keep.txt; wc -c keep.txt
echo "important" > keep.txt; : >> keep.txt; wc -c keep.txt
echo "important" > keep.txt; truncate -s 0 keep.txt; wc -c keep.txt
10 keep.txt
0 keep.txt
0 keep.txt
10 keep.txt
0 keep.txt
| 書き方 | ファイルが無いとき | 既にあるとき | 向いている場面 |
|---|---|---|---|
touch file |
空で作る | 中身は残る(時刻だけ更新) | 中身を守りながら「存在する状態」にしたい |
> file |
空で作る | 中身が消えて 0 バイト | ログなどを空に戻したい(bash) |
: > file |
空で作る | 中身が消えて 0 バイト | 上と同じ。sh・zsh でも同じ動き |
: >> file |
空で作る | 中身は残る(時刻も変わらない) | 追記モードで開くだけ |
truncate -s 0 file |
空で作る | 中身が消えて 0 バイト | サイズを指定して切り詰めたい |
echo -n > file |
空で作る | 中身が消えて 0 バイト | echo > file は改行1文字(1バイト)が入る |
: は「何もしないで成功する」コマンドです。> file だけの書き方は bash では空ファイルを作りますが、zsh では入力待ちになる設定があるため、どのシェルでも同じ動きにしたいときは : > file と書くと揃います。
echo > file は空ファイルにならない点も確かめました。
echo -n > e1; echo > e2; wc -c e1 e2
0 e1
1 e2
1 total
うっかり上書きを防ぎたいときは、set -o noclobber を設定しておく方法があります。 既にあるファイルへの > を止めてくれます(bash 5.2 での結果)。
set -o noclobber
echo "important" > nc.txt
> nc.txt
bash: nc.txt: cannot overwrite existing file
リダイレクトの詳しい使い分けは別の話題になるので、ここでは「既存ファイルを残したいなら touch、空にしたいなら : >」と押さえておけば十分です。
エラーを再現して原因と直し方を確かめる
エラー早見表
| エラーメッセージ | 主な原因 | 直し方 |
|---|---|---|
mkdir: cannot create directory ‘app’: File exists |
同じ名前のディレクトリ(またはファイル)が既にある | mkdir -p にする/別名にする/ls -ld で確かめる |
mkdir: cannot create directory ‘a/b/c’: No such file or directory |
途中の親ディレクトリが無い | mkdir -p a/b/c |
touch: cannot touch 'nodir/x.txt': No such file or directory |
親ディレクトリが無い | mkdir -p nodir && touch nodir/x.txt |
mkdir: cannot create directory ‘locked/sub’: Permission denied |
親ディレクトリに書き込み権限が無い | 権限を確かめ、自分のホーム配下で作る/管理者に権限を依頼/sudo |
touch: cannot touch 'f': Permission denied |
親ディレクトリまたは対象ファイルに書き込めない | 同上 |
mkdir: cannot create directory ‘memo.txt’: Not a directory |
パスの途中が通常ファイルになっている | パスを見直す |
File name too long |
1つの名前が 255 バイトを超えている | 名前を短くする |
touch: invalid date format |
-d・-t の日時の書き方が合っていない |
書式を確かめる |
File exists(既にある)
mkdir app
mkdir app
mkdir: cannot create directory ‘app’: File exists
2回目は終了ステータスが 1 になります。「あっても無くてもよい」なら mkdir -p app にすると、エラーなしで通ります。
同じ名前の「通常ファイル」があるときも、同じメッセージになります。
touch memo.txt
mkdir memo.txt
mkdir: cannot create directory ‘memo.txt’: File exists
この場合は -p を付けても作れません。ls -ld memo.txt で先頭が -(通常ファイル)か d(ディレクトリ)かを確かめ、別の名前を選びます。その下に作ろうとすると、メッセージが変わります。
mkdir -p memo.txt/sub
mkdir: cannot create directory ‘memo.txt’: Not a directory
No such file or directory(親が無い)
mkdir app/src/main/java
touch nodir/x.txt
mkdir: cannot create directory ‘app/src/main/java’: No such file or directory
touch: cannot touch 'nodir/x.txt': No such file or directory
どちらも「途中のディレクトリがまだ無い」ことが原因です。直し方は次のとおりです。
mkdir -p app/src/main/java
mkdir -p nodir && touch nodir/x.txt
ls nodir
x.txt
パスの打ち間違い(srv と src など)でも同じエラーになります。ls で1階層ずつ確かめると、どこから先が無いのかがわかります。
Permission denied(権限が無い)
root が持ち主で、ほかのユーザーには書き込み権限が無いディレクトリ(755)を用意し、一般ユーザー(nobody)として作成を試しました。
ls -ld locked
setpriv --reuid=65534 --regid=65534 --clear-groups mkdir locked/sub
setpriv --reuid=65534 --regid=65534 --clear-groups touch locked/f.txt
drwxr-xr-x 2 root root 4096 Oct 3 00:55 locked
mkdir: cannot create directory ‘locked/sub’: Permission denied
touch: cannot touch 'locked/f.txt': Permission denied
ディレクトリやファイルを新しく作るには、「親ディレクトリ」への書き込み権限(w)と実行権限(x)が必要です。 上の例では、locked の権限が rwxr-xr-x で、持ち主(root)以外には w がありません。
確かめる順番は次の3つです。
| 順番 | 確かめること | コマンド |
|---|---|---|
| 1 | 自分は誰か | whoami / id |
| 2 | 親ディレクトリの持ち主と権限 | ls -ld 親ディレクトリ |
| 3 | 作る場所を見直す | 自分のホーム(~)や /tmp の下で作れるか |
システムの領域(/etc、/var、/opt など)に作る必要がある場合は、sudo mkdir -p /opt/myapp のように管理者権限で実行し、必要に応じて sudo chown で持ち主を自分に変えます。
既にあるファイルの時刻を変えるだけの場合も、持ち主でなく書き込み権限も無ければ同じエラーになります。
setpriv --reuid=65534 --regid=65534 --clear-groups touch data.txt
touch: cannot touch 'data.txt': Permission denied
File name too long(名前が長い)
mkdir -p /tmp/t179long/$(printf "a%.0s" {1..300})
mkdir: cannot create directory ‘/tmp/t179long/aaaa…(300文字)’: File name too long
(出力のうち、300文字ぶんの名前は省略して載せています。)Linux の多くのファイルシステムでは、1つの名前は 255 バイトまでです。日本語(UTF-8)は1文字3バイトが多いので、85文字前後が目安になります。
Linux(GNU)とmacOS(BSD)の違い
macOS の mkdir・touch は BSD 由来で、GNU 版とはオプションに少し差があります。下の表の macOS 列は、今回は手元で実行していません(未実行)。一般に知られた仕様として整理したものなので、使う前に man mkdir・man touch で確かめてください。
| 項目 | Linux(GNU coreutils 9.4・実行済み) | macOS(BSD・未実行) |
|---|---|---|
mkdir -p / -m / -v |
使える | 使える |
長いオプション(--parents など) |
使える | 使えない(短い形式で書く) |
mkdir -Z(SELinux) |
使える | 無い |
touch -a / -m / -c / -r / -t / -h |
使える | 使える |
touch -d "yesterday" など相対表現 |
使える | 使えない(-d は YYYY-MM-DDThh:mm:SS 形式) |
touch --no-create など長い形式 |
使える | 使えない |
時刻をずらす touch -A |
無い | ある([-][[hh]mm]SS で調整) |
時刻の確認 stat -c "%y" |
使える | 書式が違う(stat -f "%Sm") |
ls --time-style=long-iso |
使える | 無い(ls -lT で秒まで表示) |
install -D |
使える | 無い(mkdir -p と touch を使う) |
tree |
パッケージで追加(apt install tree) |
Homebrew などで追加 |
| ブレース展開 | bash・zsh とも使える | zsh(標準)・bash とも使える |
両方で動かしたいスクリプトは、短いオプションだけを使い、日時指定は touch -t にそろえると書き分けが要らなくなります。
よくある質問
Q. mkdir -p は、既にあるディレクトリの中身を消しますか?
A. 消しません。既にある場合は何もせず、終了ステータス 0 で終わります。中のファイルも権限もそのままです。-m を一緒に付けていても、既存ディレクトリの権限は変わりません。
Q. touch で作ったファイルに実行権限が付かないのはなぜですか?
A. 通常ファイルは「666 から umask を引いた権限」で作られるためです。umask が 022 なら 644(rw-r--r--)になります。スクリプトとして実行したいときは、作成後に chmod +x ファイル名 を実行します。
Q. mkdir と touch を間違えて、ファイルにしたい名前でディレクトリを作ってしまいました。
A. 空のディレクトリなら rmdir 名前 で消してから touch 名前 で作り直せます。rmdir は中身があると消さないので、うっかり中身ごと消す心配がありません。中身があるディレクトリに実行すると rmdir: failed to remove 'ne': Directory not empty と表示されて止まることを確かめました。
Q. 空ファイルは何に使うのですか?
A. 目印として置く使い方が多くあります。空ディレクトリを Git に残すための .gitkeep、処理の完了を知らせるフラグファイル、Python のパッケージを示す __init__.py、これから書き込むログや設定のひな形などです。
まとめ
mkdir -pは親ごと作り、既にあってもエラーにならない。 スクリプトの「無ければ作る」はこれ1行で書ける-vで作成結果を表示、-mで権限を指定。-p -mの権限は最後のディレクトリだけに付く- ブレース展開
{a,b}・{01..03}で一括作成。 カンマの前後に空白を入れない - touch は時刻を更新するコマンド。 無ければ空で作り、あれば中身を残す。
-cで新規作成を止められる - 時刻の指定は
-d(文字列)・-t(数字)・-r(別ファイルに合わせる)。 ctime は指定できない - 階層ごとファイルを作るなら
mkdir -p "$(dirname "$f")" && touch "$f"。 >・: >は既存の中身を空にする。 残したいなら touch、空にしたいなら: >
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linux mkdir・touchの使い方|-pで階層作成と空ファイル作成」
株式会社RJCでは、mkdirやtouchのような基本コマンドの使い方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。