lsは、ディレクトリの中にあるファイルやディレクトリの一覧を表示するコマンドです。 オプションなしでは名前だけを、-l を付けると権限・所有者・サイズ・更新時刻まで1行ずつ表示します。日常で最も使う組み合わせは ls -lah(隠しファイルも含めて、詳細を、読みやすい単位で) と ls -ltr(更新が新しいものを一番下に) の2つです。

この記事では、主要オプションの一覧に加えて、ls -l の1行を列ごとに分解して図解します。s・t・+・@ といった見慣れない記号、時刻が「時:分」になったり「年」になったりする理由、mtime・atime・ctime の違い、ロケールで並び順が変わる理由まで、GNU coreutils 9.4(Ubuntu 24.04)で実行した結果を載せて説明します。macOS(BSD版)との違いは公式マニュアルで確認して表にまとめました。

lsコマンドの早見表

よく使う組み合わせ

やりたいこと コマンド
詳細を表示する ls -l
隠しファイルも含めて詳細を表示する ls -la(. と .. を除くなら ls -lA)
サイズを K・M・G で読みやすくする ls -lh
全部入りで確認する ls -lah
更新が新しい順に並べる ls -lt
更新が新しいものを一番下に出す ls -ltr
新しいものを下に、サイズも読みやすく ls -lahtr
サイズが大きい順に並べる ls -lhS
ディレクトリ自身の情報を見る ls -ld ディレクトリ名
ディレクトリだけを表示する ls -d */
種類を記号で見分ける ls -F
1行に1件ずつ出す ls -1
サブディレクトリまで表示する ls -R
日時を 2026-10-02 09:32 形式にする ls -l --time-style=long-iso
ディレクトリを先頭にまとめる ls -l --group-directories-first
数字を自然な順に並べる(f1, f2, f10) ls -v
iノード番号を表示する ls -li

主要オプション一覧

オプション 意味 分類
-l 詳細(ロング)形式で表示 表示形式
-a . で始まる隠しファイルも表示(. と .. を含む) 対象
-A 隠しファイルも表示(. と .. は除く) 対象
-h サイズを K・M・G 単位にする(1024ごと。-l や -s と併用) 表示形式
--si サイズを 1000 ごとの単位にする 表示形式
-t 更新時刻が新しい順に並べる 並び順
-r 並び順を逆にする 並び順
-S サイズが大きい順に並べる 並び順
-X 拡張子の順に並べる 並び順
-v 数字を数値として並べる(自然順) 並び順
-U 並べ替えずにディレクトリの格納順で表示 並び順
-d ディレクトリの中身ではなく、そのもの自身を表示 対象
-R サブディレクトリを再帰的に表示 対象
-1 1行に1件ずつ表示 表示形式
-F 名前の末尾に種類の記号(/ * @ |)を付ける 表示形式
-p ディレクトリの末尾にだけ / を付ける 表示形式
-i iノード番号を表示 追加情報
-s 割り当てブロック数を表示 追加情報
-n 所有者・グループを名前ではなく数値(UID・GID)で表示 追加情報
-g / -o 所有者を省略 / グループを省略して詳細表示 表示形式
-u アクセス時刻(atime)を表示・並べ替えに使う 時刻
-c 状態変更時刻(ctime)を表示・並べ替えに使う 時刻
--time-style=形式 時刻の表示形式を指定 時刻
--full-time ナノ秒とタイムゾーンまで表示 時刻
-L シンボリックリンクの先の情報を表示 対象
-I パターン パターンに一致する名前を除外 対象
-Q / -b 名前を " で囲む / 空白などを \ でエスケープ 表示形式
--color=auto 種類ごとに色を付ける(端末への出力時のみ) 表示形式
--group-directories-first ディレクトリを先にまとめる 並び順

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「lsコマンドのオプション一覧とls -lの見方|パーミッション図解」

検証に使う環境とファイル

以降の実行結果は、次の環境と練習用ディレクトリで取得しました。

$ ls --version | head -1
ls (GNU coreutils) 9.4
$ date
Fri Oct  2 09:32:55 JST 2026

練習用のファイルは次のコマンドで作れます。コピーしてそのまま試せます。

mkdir lsdemo && cd lsdemo
mkdir docs logs .config shared sticky
printf 'hello\n' > memo.txt
head -c 2048 /dev/zero > report.csv
head -c 1500000 /dev/zero > backup.tar
printf '#!/bin/sh\necho hi\n' > run.sh; chmod 755 run.sh
cp run.sh setuid.sh; chmod 4755 setuid.sh
ln -s memo.txt link.txt            # シンボリックリンク
ln memo.txt hard.txt               # ハードリンク
touch .env 'my file.txt' Apple.txt banana.txt Cherry.txt
chmod 600 .env; chmod 2775 shared; chmod 1777 sticky
mkfifo pipe
touch -d '2025-12-24 10:00' old.log
touch -d '2026-09-30 18:45' report.csv
touch -d '2027-01-05 09:00' future.txt

基本の表示とよく使うオプション

lsとls -aとls -Aの違い

$ ls
 Apple.txt    banana.txt   hard.txt   memo.txt       pipe         setuid.sh
 Cherry.txt   docs         link.txt  'my file.txt'   report.csv   shared
 backup.tar   future.txt   logs       old.log        run.sh       sticky

(端末では上のように、縦方向に名前順で読む形で横に並びます。パイプやファイルに出力すると1行に1件になります。空白を含む名前は、端末への出力時に 'my file.txt' のように引用符つきで表示されます。)

-a と -A の違いは、先頭の .(自分自身)と ..(親ディレクトリ)を出すかどうかです。

$ ls -a | head -5
.
..
.config
.env
Apple.txt
$ ls -A | head -3
.config
.env
Apple.txt
オプション . と .. .env などの隠しファイル 件数(今回)
なし 出ない 出ない 18
-A 出ない 出る 20
-a 出る 出る 22

スクリプトで件数を数えるときは -A が向いています。

ls -lahで全体を確認する

$ ls -lah
total 1.5M
drwxr-xr-x 7 root root 4.0K Oct  2 09:32 .
drwxr-xr-x 6 root root 4.0K Oct  2 09:32 ..
drwxr-xr-x 2 root root 4.0K Oct  2 09:32 .config
-rw------- 1 root root    0 Oct  2 09:32 .env
-rw-r--r-- 1 root root    0 Oct  2 09:32 Apple.txt
-rw-r--r-- 1 root root    0 Oct  2 09:32 Cherry.txt
-rw-r--r-- 1 root root 1.5M Oct  2 09:32 backup.tar
-rw-r--r-- 1 root root    0 Oct  2 09:32 banana.txt
drwxr-xr-x 2 root root 4.0K Oct  2 09:32 docs
-rw-r--r-- 1 root root    0 Jan  5  2027 future.txt
-rw-r--r-- 2 root root    6 Oct  2 09:32 hard.txt
lrwxrwxrwx 1 root root    8 Oct  2 09:32 link.txt -> memo.txt
drwxr-xr-x 2 root root 4.0K Oct  2 09:32 logs
-rw-r--r-- 2 root root    6 Oct  2 09:32 memo.txt
-rw-r--r-- 1 root root    0 Oct  2 09:32 my file.txt
-rw-r--r-- 1 root root    0 Dec 24  2025 old.log
prw-r--r-- 1 root root    0 Oct  2 09:32 pipe
-rw-r--r-- 1 root root 2.0K Sep 30 18:45 report.csv
-rwxr-xr-x 1 root root   18 Oct  2 09:32 run.sh
-rwsr-xr-x 1 root root   18 Oct  2 09:32 setuid.sh
drwxrwsr-x 2 root root 4.0K Oct  2 09:32 shared
drwxrwxrwt 2 root root 4.0K Oct  2 09:32 sticky

オプションは -l -a -h と分けても、-lah とまとめても同じです。順番も自由です。

ls -ltrで新しいものを一番下に出す

-t は更新時刻の新しい順、-r はその逆順です。組み合わせると最新のファイルが一番下、つまりプロンプトのすぐ上に来るので、件数が多いディレクトリでも直近の変更を見つけやすくなります。

$ ls -ltr --time-style=long-iso
-rw-r--r-- 1 root root       0 2025-12-24 10:00 old.log
-rw-r--r-- 1 root root    2048 2026-09-30 18:45 report.csv
(中略:2026-10-02 09:32 のファイル)
-rw-r--r-- 1 root root       0 2027-01-05 09:00 future.txt

ls -dでディレクトリ自身を見る

ディレクトリ名を渡すと、ls は中身を表示します。ディレクトリそのものの権限や所有者を見たいときは -d を付けます。

$ ls -ld docs
drwxr-xr-x 2 root root 4096 Oct  2 09:32 docs
$ ls -d */
docs/
logs/
shared/
sticky/

ls -d */ は、シェルが */ をディレクトリ名に展開し、-d で中身を開かずに表示する組み合わせです。

ls -Fで種類を記号で見分ける

$ ls -F
Apple.txt
Cherry.txt
backup.tar
banana.txt
docs/
future.txt
hard.txt
link.txt@
logs/
memo.txt
my file.txt
old.log
pipe|
report.csv
run.sh*
setuid.sh*
shared/
sticky/
記号 種類
/ ディレクトリ
* 実行可能ファイル
@ シンボリックリンク
| 名前付きパイプ(FIFO)
= ソケット
なし 通常のファイル

サイズ順・単位の指定

$ ls -lS | head -4
total 1504
-rw-r--r-- 1 root root 1500000 Oct  2 09:32 backup.tar
drwxr-xr-x 2 root root    4096 Oct  2 09:32 docs
drwxr-xr-x 2 root root    4096 Oct  2 09:32 logs

-h は 1024 ごと、--si は 1000 ごとに単位を繰り上げます。2048 バイトのファイルで比べると違いが分かります。

$ ls -lh report.csv
-rw-r--r-- 1 root root 2.0K Sep 30 18:45 report.csv
$ ls -l --si report.csv
-rw-r--r-- 1 root root 2.1k Sep 30 18:45 report.csv

なお、ディレクトリのサイズ欄(4096 など)は、ディレクトリという入れ物自体の大きさで、中のファイルの合計ではありません。 中身の合計は du -sh ディレクトリ名 で確認します。

ls -lの見方を列ごとに図解

ls -l の1行は、左から7つの情報が並んでいます。

-rw-r--r--   2    root   root   6      Oct  2 09:32   memo.txt
└───┬────┘   │     │      │     │      └────┬─────┘   └──┬───┘
    ①       ②     ③      ④     ⑤          ⑥            ⑦
番号 列 この例の値 意味
① 種別とパーミッション -rw-r--r-- 1文字目が種別、残り9文字が権限
② リンク数 2 同じ実体を指す名前(ハードリンク)の数
③ 所有者 root ファイルの所有ユーザー
④ グループ root ファイルの所有グループ
⑤ サイズ 6 バイト数(-h で K・M・G 表示)
⑥ 時刻 Oct 2 09:32 最終更新時刻(mtime)
⑦ 名前 memo.txt ファイル名。リンクは -> 参照先 が付く

先頭の total 1504 は、表示したファイルが使っているディスクブロックの合計(GNU 版は 1K 単位)で、ファイル数ではありません。

①の1文字目:ファイルの種別

文字 種別 今回の例
- 通常のファイル -rw-r--r-- ... memo.txt
d ディレクトリ drwxr-xr-x ... docs
l シンボリックリンク lrwxrwxrwx ... link.txt -> memo.txt
p 名前付きパイプ(FIFO) prw-r--r-- ... pipe
c キャラクタデバイス crw-rw-rw- 1 root root 1, 3 ... /dev/null
b ブロックデバイス brw------- 1 root root 7, 0 ... /dev/loop0
s ソケット (今回は作成なし)

デバイスファイルでは、サイズ欄の代わりに 1, 3 のような メジャー番号とマイナー番号 が表示されます。

①の残り9文字:パーミッションの読み方

9文字は3文字ずつ、所有者・グループ・その他の順に並びます。

 r w x   r - x   r - x
└──┬──┘ └──┬──┘ └──┬──┘
 所有者   グループ  その他
  (u)      (g)      (o)
文字 ファイルでの意味 ディレクトリでの意味 数値
r 内容を読める 中の名前の一覧を見られる 4
w 内容を書き換えられる 中にファイルを作成・削除・改名できる 2
x 実行できる 中に入れる(cd)、中のファイルにアクセスできる 1
- その権限がない その権限がない 0

3文字の数値を足すと、rwx=7、r-x=5、r--=4 となります。-rwxr-xr-x は 755、-rw-r--r-- は 644、-rw------- は 600 です。数値と用途の対応は、chmod の記事で詳しく扱っています。

flowchart LR
    A["-rwxr-xr-x"] --> B["- : 通常ファイル"]
    A --> C["rwx : 所有者 = 7"]
    A --> D["r-x : グループ = 5"]
    A --> E["r-x : その他 = 5"]
    C --> F["755"]
    D --> F
    E --> F

xの位置に出るs・t・S・Tの意味

x の位置に別の文字が出ているときは、特殊な権限が設定されています。

-rwsr-xr-x 1 root root   18 Oct  2 09:32 setuid.sh
drwxrwsr-x 2 root root 4096 Oct  2 09:32 shared
drwxrwxrwt 2 root root 4096 Oct  2 09:32 sticky
-rwSr--r-- 1 root root    0 Oct  2 09:33 noexec
drwxrwxrwT 2 root root 4096 Oct  2 09:33 noexecd
表示 位置 名前 意味 設定例
s 所有者の x setuid 実行した人ではなく、所有者の権限で動く chmod 4755
s グループの x setgid ディレクトリでは、中に作ったファイルがそのグループを引き継ぐ chmod 2775
t その他の x スティッキービット ディレクトリ内のファイルを、所有者だけが削除・改名できる chmod 1777
S / T 同上 同上 特殊ビットはあるが、その位置の x がない(大文字) chmod 4644、chmod 1776

身近な実例として、/tmp と passwd コマンドがあります。

$ ls -ld /tmp
drwxrwxrwt 155 root root 28672 Oct  2 09:33 /tmp
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 64152 May 30  2024 /usr/bin/passwd

/tmp は誰でも書き込めますが、t があるので他の人のファイルは削除できません。大文字の S や T は「x を付け忘れているかもしれない」という合図として読めます。

権限の直後に付く「+」「.」「@」

10文字の直後に記号が付くことがあります。

記号 意味 環境
+ ACL(アクセス制御リスト)が設定されている Linux・macOS
. SELinux のセキュリティコンテキストがある SELinux が有効な Linux(RHEL 系など)
@ 拡張属性がある macOS

setfacl で ACL を付けると、実際に + が現れました。

$ setfacl -m u:nobody:r memo.txt
$ ls -l memo.txt
-rw-r--r--+ 2 root root 6 Oct  2 09:32 memo.txt
$ getfacl memo.txt
# file: memo.txt
# owner: root
# group: root
user::rw-
user:nobody:r--
group::r--
mask::r--
other::r--

+ があるときは、rwx の9文字だけでは実際の権限が分かりません。 getfacl ファイル名(macOS では ls -le)で内容を確認します。@ は macOS の表示で、ls -l@ で属性名を確認できます(macOS は未実行で、公式マニュアルで確認した内容です)。

②リンク数の見方

リンク数は、同じ実体(iノード)を指している名前の数です。

$ ls -li memo.txt hard.txt
2023924 -rw-r--r-- 2 root root 6 Oct  2 09:32 hard.txt
2023924 -rw-r--r-- 2 root root 6 Oct  2 09:32 memo.txt

ln memo.txt hard.txt で作ったハードリンクは、iノード番号(左端)が同じで、リンク数が 2 になっています。シンボリックリンクの link.txt はリンク数に数えられません。

ディレクトリのリンク数は「2 + サブディレクトリの数」です。サブディレクトリを3つ持つ tree は 5 になりました。

$ mkdir -p tree/a tree/b tree/c
$ ls -ld tree
drwxr-xr-x 5 root root 4096 Oct  2 09:37 tree

2 の内訳は、親から見た名前(tree)と、自分自身を指す tree/. です。各サブディレクトリの .. が1つずつ加わります。

③④所有者とグループ

名前ではなく数値で見たいときは -n を使います。別のサーバーからコピーしたファイルなど、ユーザー名が登録されていない場合の確認に便利です。

$ ls -n memo.txt
-rw-r--r-- 2 0 0 6 Oct  2 09:32 memo.txt

⑦名前とシンボリックリンク

シンボリックリンクは 名前 -> 参照先 と表示され、サイズ欄は参照先のパス文字列の長さ(memo.txt は8文字なので 8)になります。リンク先の情報を見たいときは -L を付けます。

$ ls -l link.txt
lrwxrwxrwx 1 root root 8 Oct  2 09:32 link.txt -> memo.txt
$ ls -lL link.txt
-rw-r--r-- 2 root root 6 Oct  2 09:32 link.txt

時刻の表示ルールと--time-style

半年を境に「時:分」と「年」が切り替わる

ls -l の時刻欄は、ファイルによって形式が変わります。

-rw-r--r-- 1 root root 0 Jan  5  2027 future.txt
-rw-r--r-- 1 root root 0 Apr 10 12:00 m6a.txt
-rw-r--r-- 1 root root 0 Mar 25  2026 m6b.txt
-rw-r--r-- 1 root root 0 Apr  3 12:00 m6c.txt
-rw-r--r-- 1 root root 0 Mar 31  2026 m6d.txt

実行日は 2026年10月2日です。約半年前(4月3日)までは「月 日 時:分」、それより前(3月31日)は「月 日 年」になりました。未来の日付(2027年1月)も年表示です。

ファイルの更新時刻 表示 例
現在から約6か月以内 月 日 時:分 Apr 3 12:00
約6か月より前 月 日 年 Mar 31 2026
未来の時刻 月 日 年 Jan 5 2027

「最近のファイルは時刻が大事、以前のファイルは年が大事」という考え方に基づく表示です。年と時刻の両方を常に見たいときは、次の --time-style を使います。

--time-styleで形式をそろえる

# --time-style=long-iso
-rw-r--r-- 2 root root 6 2026-10-02 09:32 memo.txt
-rw-r--r-- 1 root root 0 2025-12-24 10:00 old.log

# --time-style=full-iso(--full-time と同じ)
-rw-r--r-- 2 root root 6 2026-10-02 09:32:55.453129680 +0900 memo.txt
-rw-r--r-- 1 root root 0 2025-12-24 10:00:00.000000000 +0900 old.log

# --time-style=iso
-rw-r--r-- 2 root root 6 10-02 09:32 memo.txt
-rw-r--r-- 1 root root 0 2025-12-24  old.log

# --time-style='+%Y-%m-%d %H:%M:%S'
-rw-r--r-- 2 root root 6 2026-10-02 09:32:55 memo.txt
-rw-r--r-- 1 root root 0 2025-12-24 10:00:00 old.log

# --time-style=+%F
-rw-r--r-- 2 root root 6 2026-10-02 memo.txt
-rw-r--r-- 1 root root 0 2025-12-24 old.log
指定 形式 向いている用途
long-iso 2026-10-02 09:32 普段使い。年と時刻が常に出る
full-iso ナノ秒とタイムゾーンまで 細かい前後関係の確認
iso 最近は 10-02 09:32、以前は 2025-12-24 幅を詰めたいとき
locale ロケールに従う(既定) 既定の表示
+書式 date コマンドと同じ書式 秒まで出す、日付だけにする など

毎回指定する代わりに、環境変数 TIME_STYLE に設定しておく方法もあります。

$ TIME_STYLE=long-iso ls -l memo.txt
-rw-r--r-- 2 root root 6 2026-10-02 09:32 memo.txt

ロケールが日本語のときは、月の表記が変わります。

$ LANG=ja_JP.UTF-8 ls -l memo.txt old.log future.txt
-rw-r--r-- 1 root root 0  1月  5  2027 future.txt
-rw-r--r-- 2 root root 6 10月  2 09:32 memo.txt
-rw-r--r-- 1 root root 0 12月 24  2025 old.log

ls -l の出力をスクリプトで処理する場合、ロケールや半年ルールで列の形が変わる点に注意が必要です。 時刻を機械的に扱うなら stat -c '%y %n' や find -printf を使うと形式が安定します。

mtime・atime・ctimeの違いをstatで確認する

ファイルには3種類の時刻が記録されています。ls -l が既定で表示するのは mtime です。

時刻 名前 更新されるとき ls での表示
mtime 最終更新時刻(Modify) 内容を書き換えたとき ls -l(既定)
atime 最終アクセス時刻(Access) 内容を読んだとき ls -lu
ctime 状態変更時刻(Change) 内容・権限・所有者・名前・リンク数が変わったとき ls -lc

ctime は「作成時刻(create)」ではなく「変更(change)」の c です。 操作ごとにどの時刻が動くかを、stat で順に確認しました。

printf 'v1\n' > t.txt
touch -d '2026-10-01 08:00' t.txt     # mtime と atime を前日にそろえる
# 0 最初の状態
mtime=2026-10-01 08:00:00.000000000 +0900
atime=2026-10-01 08:00:00.000000000 +0900
ctime=2026-10-02 09:37:23.156510037 +0900

# 1 cat t.txt(読む) → atime だけ変わる
mtime=2026-10-01 08:00:00.000000000 +0900
atime=2026-10-02 09:37:24.361145665 +0900
ctime=2026-10-02 09:37:23.156510037 +0900

# 2 chmod 600 t.txt(権限を変える) → ctime だけ変わる
mtime=2026-10-01 08:00:00.000000000 +0900
atime=2026-10-02 09:37:24.361145665 +0900
ctime=2026-10-02 09:37:25.565145736 +0900

# 3 echo v2 >> t.txt(内容を変える) → mtime と ctime が変わる
mtime=2026-10-02 09:37:26.773145808 +0900
atime=2026-10-02 09:37:24.361145665 +0900
ctime=2026-10-02 09:37:26.773145808 +0900

# 4 mv t.txt t2.txt(名前を変える) → ctime だけ変わる
mtime=2026-10-02 09:37:26.773145808 +0900
atime=2026-10-02 09:37:24.361145665 +0900
ctime=2026-10-02 09:37:27.977145880 +0900

(表示には stat --printf='mtime=%y\natime=%x\nctime=%z\n' ファイル名 を使いました。)

操作 mtime atime ctime
読む(cat) - 変わる -
権限を変える(chmod) - - 変わる
内容を変える(追記・上書き) 変わる - 変わる
名前を変える(mv) - - 変わる
touch -d で時刻を指定 指定値 指定値 現在時刻

ls では、-u と -c で表示する時刻を切り替えられます。

$ ls -l  --time-style=full-iso t2.txt     # mtime
-rw------- 1 root root 6 2026-10-02 09:37:26.773145808 +0900 t2.txt
$ ls -lu --time-style=full-iso t2.txt     # atime
-rw------- 1 root root 6 2026-10-02 09:37:24.361145665 +0900 t2.txt
$ ls -lc --time-style=full-iso t2.txt     # ctime
-rw------- 1 root root 6 2026-10-02 09:37:27.977145880 +0900 t2.txt

覚えておくと役立つ点が3つあります。

  • mtime は touch で自由に変えられますが、ctime は利用者が直接指定できません。 「いつ手が加わったか」を調べるときは ctime も合わせて見ます。
  • atime は、多くの Linux で relatime という設定になっており、読むたびに毎回更新されるわけではありません(今回の環境も relatime でした)。
  • 作成時刻(Birth)は stat の Birth: 欄で確認でき、GNU ls では ls -l --time=birth で表示できます(ファイルシステムが対応している場合)。

並び順はロケールで変わる

ls の既定の並びは名前順ですが、「名前順」の定義はロケール(言語と地域の設定)によって変わります。

$ LC_ALL=C ls *.txt
 Apple.txt   Cherry.txt   banana.txt   future.txt   hard.txt   link.txt   memo.txt  'my file.txt'

$ LC_ALL=en_US.UTF-8 ls *.txt
 Apple.txt   banana.txt   Cherry.txt   future.txt   hard.txt   link.txt   memo.txt  'my file.txt'
ロケール 並び方 結果
C(C.UTF-8、POSIX) 文字コード順。大文字がすべて小文字より先 Apple → Cherry → banana
en_US.UTF-8、ja_JP.UTF-8 など 辞書に近い順。大文字と小文字を区別せずに並べる Apple → banana → Cherry

サーバーによって並びが違って見えるときは、echo $LANG $LC_ALL でロケールを確認します。スクリプトなどで並び順を固定したいときは LC_ALL=C ls と書くと、環境に左右されません。

数字を含む名前は、-v で自然な順になります。

$ ls f*
f1  f10  f2  future.txt
$ ls -v f*
f1  f2  f10  future.txt

並び順を変えるオプションをまとめます。

オプション 並び順 逆順にするには
(なし) 名前順(ロケール依存) -r
-t 更新時刻の新しい順 -tr
-S サイズの大きい順 -Sr
-X 拡張子順 -Xr
-v 数字を数値として扱う自然順 -vr
-U 並べ替えなし(件数が多いときに速い) -
-tu / -tc atime 順 / ctime 順 -r を追加
--group-directories-first ディレクトリを先に(他の並びと併用可) -

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

Linux の ls は GNU coreutils、macOS の ls は BSD 系で、オプションに違いがあります。以下の macOS 側は公式マニュアル(man ls)で確認した内容で、今回の環境では未実行です。

やりたいこと GNU(Linux) BSD(macOS)
色を付ける --color=auto -G(新しい版は --color=auto も可)
-G の意味 グループ列を省略 色を付ける
時刻を完全な形で表示 --full-time、--time-style=full-iso -T(秒と年まで表示)
時刻の書式を指定 --time-style=+書式 -D 書式
ディレクトリを先に並べる --group-directories-first 対応するオプションなし
自然順(f1, f2, f10) -v -v は別の意味(表示できない文字の扱い)
拡張子順 -X 対応するオプションなし
-U の意味 並べ替えなし 作成時刻を使う
並べ替えなし -U または -f -f
ACL の内容を表示 getfacl(別コマンド) ls -le
拡張属性を表示 getfattr(別コマンド) ls -l@
ファイルフラグを表示 lsattr(別コマンド) ls -lO
権限の後ろの記号 +(ACL)、.(SELinux) +(ACL)、@(拡張属性)
ファイル名の後ろにオプション ls docs -l でも解釈される オプションはファイル名より前に書く
共通して使える -l -a -A -h -t -r -S -d -R -1 -F -i -n -u -c 同じ

両方で同じ書き方をしたい場合は、共通のオプションだけを使い、オプションをファイル名より前に書くと安定します。macOS で GNU 版を使いたいときは、Homebrew の coreutils を入れると gls という名前で利用できます。

便利なエイリアス例

よく使う組み合わせは、~/.bashrc(zsh は ~/.zshrc)にエイリアスとして登録しておくと入力が短くなります。

# ~/.bashrc
alias ls='ls --color=auto'                      # 色を付ける
alias ll='ls -alF'                              # 全件を詳細表示+種類の記号
alias la='ls -A'                                # 隠しファイルも表示
alias l='ls -CF'                                # 横並び+種類の記号
alias lt='ls -lhtr --time-style=long-iso'       # 新しいものを下に
alias lS='ls -lhS'                              # 大きい順
alias lsd='ls -d */'                            # ディレクトリだけ
export TIME_STYLE=long-iso                      # 時刻の形式を固定

設定後は source ~/.bashrc で読み込みます。実行例です。

$ ll -d docs
drwxr-xr-x 2 root root 4096 Oct  2 09:32 docs/
場面 書き方
エイリアスを一時的に使わない \ls または command ls
現在のエイリアスを確認 alias または type ls
macOS で色を付ける alias ls='ls -G'

ll や la は、Ubuntu などでは最初から ~/.bashrc に定義されています。ディストリビューションによって内容が異なるため、type ll で確認できます。

よくあるつまずきと対処

症状 原因 対処
ls: cannot access 'x': No such file or directory 名前が存在しない、またはつづり・大文字小文字の違い ls で実際の名前を確認する。終了コードは 2
ls: cannot open directory '/root': Permission denied ディレクトリに r 権限がない ls -ld で権限を確認し、必要なら sudo ls
ディレクトリ名を渡すと中身が出る 既定の動作 ls -ld ディレクトリ名
隠しファイルが出ない . 始まりは既定で非表示 ls -A
-h を付けてもサイズが変わらない -l か -s がない ls -lh
時刻が年表示になり、時:分が分からない 半年ルール --time-style=long-iso
サーバーごとに並び順が違う ロケールの違い LC_ALL=C ls
ファイル名が 'my file.txt' と引用符つきで出る 空白を含む名前を端末に表示するときの仕様 ls -N、または QUOTING_STYLE=literal
パイプに渡すと色のコードが混ざる --color=always を指定している --color=auto にする
スクリプトで ls の結果をループすると名前が分かれる 空白や改行を含む名前 for f in *; do ...; done や find -print0 を使う

実際のエラー表示です。

$ ls nothere
ls: cannot access 'nothere': No such file or directory
$ echo $?
2
$ ls /root        (一般ユーザーで実行)
ls: cannot open directory '/root': Permission denied

名前の引用表示は、オプションで切り替えられます。

$ ls 'my file.txt'
'my file.txt'
$ ls -Q 'my file.txt'
"my file.txt"
$ ls -b 'my file.txt'
my\ file.txt
$ ls -N 'my file.txt'
my file.txt

よくある質問

Q. ls -l と ll は同じですか? A. ll は ls のオプションつきエイリアスです。Ubuntu では ls -alF、RHEL 系では ls -l --color=auto というように、ディストリビューションによって中身が違います。type ll で定義を確認できます。エイリアスが設定されていない環境やスクリプトでは ls -l と書きます。

Q. ls -l の先頭に出る total は何の数字ですか? A. 表示したファイルが使用しているディスクブロックの合計です(GNU 版は 1K 単位)。ファイルの個数ではありません。ls -lh では total 1.5M のように読みやすい単位になります。件数を知りたいときは ls -1A | wc -l を使います。

Q. ls -la と ls -al に違いはありますか? A. 違いはありません。1文字オプションは順番を入れ替えても、-l -a と分けても同じ結果です。-lah、-hal、-alh も同じです。

Q. ファイルの作成日時は ls で見られますか? A. ls -l が表示するのは最終更新時刻(mtime)です。作成時刻は stat ファイル名 の Birth: 欄で確認できます。GNU ls では ls -l --time=birth、macOS では ls -lU で表示できます(macOS は公式マニュアルで確認)。ls -lc の ctime は「状態変更時刻」で、作成時刻とは別のものです。

まとめ

  • 普段使いは ls -lah と ls -ltr。前者は全体の確認、後者は直近の変更の確認に向いている
  • ls -l の1行は「種別と権限・リンク数・所有者・グループ・サイズ・時刻・名前」の7列
  • 権限は3文字ずつ「所有者・グループ・その他」。s・t は特殊ビット、大文字の S・T は x がない状態、+ は ACL、@ は macOS の拡張属性
  • 時刻は約半年を境に「時:分」と「年」が切り替わる。常にそろえるなら --time-style=long-iso
  • 既定の時刻は mtime。-u で atime、-c で ctime。ctime は作成ではなく状態変更の時刻
  • 並び順はロケールで変わる。固定したいときは LC_ALL=C ls、数字の自然順は -v
  • GNU 版と macOS 版では -G・-U・-v の意味が違う。共通オプションだけを使うと同じ書き方で通用する

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「lsコマンドのオプション一覧とls -lの見方|パーミッション図解」

株式会社RJCでは、lsをはじめとするLinuxコマンドの読み方と使い方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?