Linux / コマンド / ls - ファイルとディレクトリの一覧確認

lsは、Linuxでファイルとディレクトリの一覧を確認するコマンドです。基本的な一覧だけでなく、隠しファイル、権限と所有者、ファイルサイズ、更新時間、並び順までオプションで選択して表示できます。

日常的な確認にはls -lahが便利ですが、スクリプトでファイル名を安全に扱う場合は、人間向けに作られたlsの出力よりもfindのようなコマンドを使う方が良いです。

lsコマンドとは?

lsはlistの略で、指定したファイルの情報やディレクトリの内容を列挙します。この記事は GNU Coreutils の ls を基準にしています。Linux でも実装が異なる場合があるため、ls --version と ls --help で対象を確認してください。

引数なしで実行すると現在のディレクトリを対象にし、名前がドット(.)で始まる隠し項目は基本的に表示しません。ディレクトリ名を引数として指定すると、そのディレクトリ自身ではなく内部の項目を表示します。

基本的な文法

ls [オプション]... [ファイルまたはディレクトリ]...

現在のディレクトリの項目を確認するには、次のように実行します。

ls

特定のディレクトリやファイルを指定することもできます。

ls /var/log
ls /etc/hosts
ls /etc /usr/local

複数の対象を指定しても、入力順どおりの表示とは限りません。既定では対象にも並べ替えが適用され、通常のファイルの表示とディレクトリ内容の表示は別にまとめられます。ディレクトリの内容は、デフォルトで現在のロケールの並べ替えルールに従ってファイル名順に表示されます。

隠しファイルまで表示する

すべての項目を表示する -a

-a または --all はドットから始まる隠しファイルとディレクトリを含みます。現在のディレクトリを意味する . と上位ディレクトリを意味する .. も合わせて表示されます。

ls -a

. と .. を除外する -A

-A または --almost-all は隠し項目を表示しますが、. と .. は除外されます。実際の設定ファイルだけを確認する場合、出力がより簡潔になります。

ls -A

詳細情報を表示する ls -l

-l は長い形式(long format)で、ファイルの種類と権限、ハードリンクの数、所有者、グループ、サイズ、更新日時、名前を表示します。

ls -l

一般的な出力の1行は次の順序で構成されます。

項目 意味
種類と権限 ファイルタイプ1文字と所有者・グループ・その他ユーザーの読み取り、書き込み、実行権限です。
ハードリンク数 ファイルの inode(属性などを管理するファイルシステム内部の構造)を指すディレクトリエントリの数です。ハードリンクとシンボリックリンクの違いも参照してください。ディレクトリのリンク数はファイルシステムによって扱いが異なります。
所有者 ファイル所有アカウントの名前またはユーザーIDです。
グループ ファイルが属するグループの名前またはグループIDです。
サイズ 基本的にバイト単位のファイルサイズです。
時間 デフォルトはファイルデータが最後に変更された修正時間(mtime)です。
名前 ファイル名です。シンボリックリンクはリンクが指す対象も一緒に表示されることがあります。

権限文字列の読み方

-rw-r--r--のように見える文字列の最初の文字はファイルの種類で、後の9文字は所有者、グループ、その他のユーザーごとの権限です。rは読み取り、wは書き込み、xは実行権限を意味します。

場所 例 説明
最初の文字 -, d, l 通常のファイル、ディレクトリ、シンボリックリンクなどの種類です。
2~4番目 rw- 所有者の権限です。
5~7番目 r-- グループの権限です。
8~10番目 r-- その他のユーザーの権限です。

権限文字列の後に+や他の表示が付いている場合、アクセス制御リスト(ACL)のような追加のセキュリティ情報があるという意味かもしれません。詳細な権限変更にはchmod、所有権変更にはchownを使用します。

数字IDで表示する-n

ユーザー名とグループ名の代わりに数字IDを確認するには-nを使用します。アカウント名の照会が遅い場合や、他のシステムとIDを比較する際に便利です。

ls -ln

ファイルサイズを読みやすく表示する

人間が読みやすい単位で表示する -h

-hはサイズを 1024 の累乗単位で短く表示します。通常の出力表記は K、M、G などで、それぞれ KiB、MiB、GiB に相当します。サイズ列がある-lまたは-sと一緒に使用します。

ls -lh
ls -lah

ls -lahは隠し項目まで長い形式で表示するため、対話型作業でよく使用されます。

ディスクへの割り当て量を表示する -s

-sは各ファイルのファイルシステム上の割り当て量を表示します。GNU 版では通常 1024 バイト単位ですが、ブロックサイズの設定などで変わります。ファイルの論理サイズと実際のディスク割り当て量は、スパースファイル、圧縮、およびファイルシステムの特性により異なる場合があります。

ls -sh
ls -lsh

ディレクトリ全体の使用量は du による容量の集計と大きな項目の確認を利用してください。

並べ替え順序を変更する

lsは、デフォルトでファイル名を現在のロケールの文字列順序に従って並べ替えます。目的に応じて、時間、サイズ、拡張子、またはバージョン順に変更できます。

修正時間順に並べ替える -t

ls -lt
ls -lat

-tは、デフォルトで修正時間が新しい項目から表示されます。ログや最近作成された結果ファイルを探すときに便利です。

サイズ順に並べ替える -S

ls -lhS

-Sは、大きいファイルから並べ替えます。ディレクトリ項目に表示されるサイズは内部ファイルの合計ではないため、ディスク使用量の比較にはduを使用してください。

逆順およびバージョン順で並べ替える -r, -v

ls -ltr
ls -1v

-rは、現在の並べ替え順序を逆にします。したがってls -ltrは古い項目から表示されます。-vは、file2がfile10より先に来るように、数字部分を考慮したバージョン順で並べ替えを使用します。

ディレクトリを区別してディレクトリ自体を見る

種類表示を付ける -F

-F または --classify は、ディレクトリの後に /、実行可能ファイルの後に *、シンボリックリンクの後に @ のように種類表示を付けます。

ls -F

表示は実際のファイル名の一部ではありません。スクリプトで種類を判断するとき、この文字を切り取らずにファイルテスト演算子や find を使ってください。

ディレクトリ内容の代わりに自身の情報を見る -d

ディレクトリ名を指定すると、基本的には内部の内容を表示します。ディレクトリ項目自体の権限や時間を見るには -d を併用してください。

ls -ld /var/log
ls -d */

ls -d */ は現在位置の一般的なサブディレクトリ名を確認するときに便利ですが、シェルのグロブ展開規則に従い、Bash の既定設定では隠しディレクトリは含まれません。dotglob などの設定で対象は変わり、一致するディレクトリがない場合はパターンがそのまま渡ってエラーになることもあります。

ディレクトリを先に集める

ls --group-directories-first

GNU lsでは、ディレクトリをファイルより先にグループ化することができます。このオプションはGNU拡張なので、他のUnix系システムでのサポート状況を確認する必要があります。

サブディレクトリまで再帰的に表示

ls -R /etc

-R または --recursive はサブディレクトリをたどりながら内容を表示し続けます。ツリーが大きい場合、出力が非常に長くなり、アクセス権エラーも多く発生する可能性があります。

特定の名前や条件でファイルを探すには、全体の一覧を目で確認するよりも find を使用した方が効率的です。

find /etc -type f -name '*.conf'

時間の種類と表示形式の選択

アクセス時間と状態変更時間

ls -l は基本的に修正時間(mtime)を表示します。-u はアクセス時間(atime)、-c はメタデータ状態変更時間(ctime)を表示したり、ソート基準として使用します。

ls -lu
ls -lc
ls -ltu
ls -ltc

ctime はファイルの「作成された時間」ではなく、権限、所有者、リンク数のような inode 状態が最後に変更された時間です。

一貫した日付形式を使用する

GNU lsの--time-styleにより、長い形式の日付表示を選択できます。

ls -l --time-style=long-iso
ls -l --time-style=full-iso
ls -l --time-style='+%Y-%m-%d %H:%M:%S'

出力はロケールとTZ環境変数の影響を受ける場合があります。人が比較するレポートであれば、タイムゾーンと表示形式を一緒に設定することをお勧めします。

色とファイル名の表示方法

色を使用する

ls --color=auto

--color=autoは出力がターミナルの場合、ファイルタイプと拡張子に応じて色を使用します。多くのディストリビューションではlsのエイリアスとしてこのオプションをデフォルトで適用しています。

type ls
alias ls

色はLS_COLORS環境変数とdircolorsの設定の影響を受けます。ファイルに保存したり、他のコマンドに渡したりする際に、不要な制御文字が含まれないよう--color=neverを使用できます。

空白や特殊文字を含むファイル名

lsは、端末やオプションに応じて、空白や制御文字を含むファイル名を引用符またはエスケープ形式で表示することがあります。表示された文字列が実際のファイル名と常に同じ形であると仮定してはいけません。

ls -Q
ls --quoting-style=shell-escape

-Qはファイル名を二重引用符で囲みます。 --quoting-styleはGNU拡張であり、人が特殊文字を認識するのに便利ですが、安全な自動処理形式の代わりにはなりません。

よく使う組み合わせ

コマンド 用途
ls -la 隠し項目を含む詳細情報を表示します。
ls -lah 隠し項目と詳細情報を読みやすいサイズ単位で表示します。
ls -lhS 大きなファイルから詳細情報を表示します。
ls -ltr 古い更新日時から長い形式で表示します。
ls -ld */ 現在位置のサブディレクトリ自身の情報を表示します.
ls -1 項目を1行ずつ表示します。
ls -1v バージョン番号を考慮して1行ずつ並べます。
ls -l --time-style=long-iso 日付と時刻を比較しやすい形式で表示します。

主要オプションの要約

オプション 説明
-a, --all .と..を含む隠し項目を表示します。
-A, --almost-all .と..を除く隠し項目を表示します。
-l 権限、所有者、サイズ、時間などを長い形式で表示します。
-h, --human-readable サイズを人が読みやすい単位で表示します。
-d, --directory ディレクトリの内容の代わりにディレクトリ項目自体を表示します。
-R, --recursive サブディレクトリまで再帰的に表示します。
-t 基本的に最近の更新時間から並べます。
-S ファイルサイズが大きい順に並べます。
-r, --reverse 現在の並び順を逆にします。
-v ファイル名の数字部分を考慮したバージョン順で並べます。
-F, --classify ファイルの種類を示す文字を名前の後ろに付けます。
-1 1行に1項目だけ表示します。

スクリプトで ls の出力をパースしてはいけない理由

Linux のファイル名にはスペース、タブ、改行が含まれることがあります。ls は人間がターミナルで読みやすいように列、色、引用方法を変えるため、行単位で分割したりスペースで切るスクリプトは誤ったファイルを扱う可能性があります。

ファイルを巡回する際は、NUL 文字を区切り文字としてサポートするツールを使用してください。次の read -d の例は Bash 向けです。ループ内では名前を一つずつ受け取れますが、最後の printf は人向けの改行区切り表示なので、その出力を再び行ごとに分解して自動処理しないでください。

find . -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file; do
  printf '%s\n' "$file"
done

対応するバージョンの GNU ls には --zero オプションもありますが、検索条件や後続処理を構成する場合、通常 find -print0 の方が明確です。ファイル1つの正確なメタデータが必要な場合は、stat を使用できます。

よく発生する問題

Permission denied が表示されます。

一覧を読みたいディレクトリに必要な権限がない可能性があります。パス構成要素の実行権限と対象ディレクトリの読み取り権限を ls -ld パス または namei -l パス で確認してください。権限を回避するために習慣的に sudo を使用するよりも、まず必要なアクセス権かどうかを判断する方が良いです。

ソート順が予想と異なります。

基本的な名前のソートは LC_COLLATE のロケールの影響を受けます。再現可能なバイト順が必要な場合は、該当するコマンドだけに LC_ALL=C を適用できます。

LC_ALL=C ls

引数リストが長すぎるエラーが発生します。

ls * でのアスタリスクは ls ではなく、シェルが最初に多数のファイル名に展開します。OS の引数サイズ制限を超えると、コマンドの実行前にエラーが発生します。単純なリストは ls のみ実行し、条件検索やバッチ処理は find と -exec、または NUL 区切りパイプラインを使用してください。

FAQ

ls -l でディレクトリのサイズは内部ファイルの合計ですか?

いいえ。長い形式で表示されるディレクトリのサイズは、ディレクトリ自体のデータサイズであり、内部ファイルの合計ではありません。ディレクトリごとのディスク使用量は du -sh ディレクトリ で確認してください。

ls -a と ls -A の違いは何ですか?

-a は、すべての隠し項目に加えて .、.. も表示します。-A は隠し項目を表示しますが、この2つの特殊ディレクトリエントリは除外します。

最近修正されたファイルを先に表示するにはどうすればいいですか?

ls -ltを使用すると、修正時間が最近の項目から長い形式で表示されます。古い項目から見たい場合は、逆順オプションを追加してls -ltrを使用してください。

参考資料