Linuxでディレクトリの内容を詳細に表示する方法

Linuxでディレクトリの内容を詳細に表示する方法の実務上の結論は「人が直下一覧を見るならls -la、directory自身のmetadataはstat、機械処理する候補はfind -maxdepth 1で取得します。ls出力をscriptでparseしません。」です。directory自体のmetadataと、直下entryの一覧は別の観測です。特殊文字を含む名前を表示崩れで失わないよう、機械処理ではNUL区切りまたは名前を出さない件数化を使います。

目次

directory自身と直下entryを分ける

directoryの詳細には、directory inode自身のowner/mode/timeと、直下entryの一覧という二つの意味があります。ls -laは人が一覧を見る用途、statは指定したdirectory自身、findは条件付きでentryを列挙、getfaclはACLとdefault ACLを確認する用途です。一つのls出力だけで権限、容量、再帰内容を全て説明しようとしません。

ls -la — directoryでhidden entryを含む目視、stat –formatでdirectory自身のdevice/inode/mode/owner/time、find directory -maxdepth 1で境界を明示した列挙を行います。名前に空白や改行がある場合はfind -print0を使います。getfaclでmaskとdefault ACLを読み、末尾の+表示だけを詳細そのものと考えません。

directory inodeと直下entryの調査目的を分ける

  • directory自身か配下entryかを決める
  • hidden entryとsymbolic linkを含めるか決める
  • owner、mode、ACL、sizeの必要項目を決める
  • 特殊file名を安全に表示・受渡しする方法を決める

ls -ldでdirectory inodeを、一覧ではrootとdepthを確認します。search permissionがない時はchmodで回避せず停止し、ownerへ必要最小権限または承認済みsnapshotの提供を依頼します。

ls・stat・find・getfaclを役割別に使う

直下一覧を人向け表示

ls -la -- ./project

dot entryを含む確認用で、columnを自動parseしません。

directory自身のmetadata

stat --format='%n|%F|%U|%G|%a|%i|%h|%x|%y|%z' -- ./project

content一覧ではなくdirectory inodeの属性を取得します。

直下一階層をfindで表示

find ./project -mindepth 1 -maxdepth 1 -printf '%y %m %u %g %s %p\n'

GNU findのformatを明示し、表示用途に限定します。

entryごとに一byte出して件数化

find ./project -mindepth 1 -maxdepth 1 -printf '.' | wc -c

entryごとにdot一byteだけを出し、nameをlineへ展開せずwc -cで直下件数を得ます。

directory ACLを確認

getfacl --absolute-names -- ./project

default ACLとaccess ACL、maskをmode bitと分けて読みます。

ls・stat・find・getfaclの役割

ls -lのsize列はregular fileではbyte数、directoryではentry合計容量ではなくdirectory file自体の値です。totalはfilesystem block集計でduのrecursive合計と別です。statはdirectory自身、findは選択したentryを扱います。file名はspace、tab、newline、control byteを含み得ます。

lsの先頭文字はfile type、mode列はACLなど追加情報を記号で示すことがあります。directoryのsize列は中身の合計容量ではなく、directory entry用dataのsizeです。mtimeは直下entryの作成・削除等で動きますが、子孫file内容の全変更を表しません。owner名は名前解決結果なので、automationではuid/gid数値も保存します。

dotfile見落とし、localeによるsort順、名前のcontrol文字、ACL mask、NFS id mapping、途中更新を区別します。Permission deniedで一部だけ列挙できない場合をempty directoryとしません。lsの列を空白splitすると名前の空白や日付formatで壊れ、表示用quoteやcolor codeも影響します。機械処理はstat/findの明示formatへ切り替えます。

empty・permission不足・特殊file名を分類する

  • ls出力をfield位置でparseする
  • directoryのsize列を配下合計とする
  • hidden fileを存在しない扱いにする
  • symbolic linkを参照先と混同する
  • newline入りfile名を一行一entryと仮定する

entry 0件と一覧取得不能をstatusで分けます。newlineを含む名前をline数で数えず、ACLやmount差が疑われる場合はdevice・inodeを保存して、同じsnapshotでfind結果を取り直します。

権限を緩めずdirectory一覧を収集する

一覧を得るためpermissionを緩めません。owner名、内部path、ACLを共有前にreviewします。recursive sizeが必要な場合はduを別に実行し、productionでのI/O負荷を見積もります。findへ変更actionを加えません。

詳細確認のためchmod -R、chown -R、ACL resetを実行しません。directoryのx権限はpath traversalへ関係し、安易な付与は子entryへのaccessを広げます。収集一覧にsecret file名やuser名が含まれる場合は保存先を制限します。変更が必要なら一entryずつ対象を固定し、元mode/ACLをbackupして別承認にします。

機械処理にlsを使わない検証

通常、hidden、space、newline、symlink、subdirectory、ACL付きentryのsampleでls/stat/findを比較します。期待entry数、type、mode、ownerを照合し、stderrとpermission errorを別に記録します。

通常/hidden file、subdirectory、symbolic link、space/newline名、ACL/default ACL、read不可entryをtest treeへ用意します。ls -la、stat、find -maxdepth 1 -print0、getfaclの結果を期待集合と照合します。entry追加・削除前後でdirectory mtimeとinodeを確認し、一覧取得中に変化したrunを一貫性なしとして扱います。

NUL安全なentry inventoryへ変換する

inventoryはNUL安全なpath、file type、device/inode、uid/gid、mode、size、mtime、ACL取得statusを構造化します。lsの色付き・locale依存表示をparseしません。最大depthとfilesystem境界を固定し、entry数上限、timeout、permission error件数を監視します。取得前後のdirectory mtimeが変われば再走査またはpartialと注記します。

目視一覧はls -la、directory自身の属性はstat、機械的なentry列挙はfind、共有権限はgetfacl、合計容量はduを選びます。用途ごとのcommandを分けると、directory sizeやACLをlsの一列から誤読しません。再帰inventoryは負荷と機密性を評価した専用jobへ切り替えます。

合格は空directory、hidden entry、newline名、permission不可fixtureでinode情報とentry件数を混同しないことです。不完全な一覧はinventoryへ登録せず、権限復旧後に再収集します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次