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へ登録せず、権限復旧後に再収集します。

コメント