Linux環境のstat(1)で表示形式

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

新しいサーバへコンテンツの移行時など稀に

  • パーミションの確認がやりたい
  • 動作している環境のパーミション情報にそったパーミションに合わせたい。
  • パーミション情報に絞ったdiffができるとうれしい。

っていうシチュエーションがあったりします。

定番のls -Rlで実行するとlsなので当然下記のような情報の並び方になります。
これはこれで一覧性があるのですが、情報のサマリとして再利用するにはちょっと不便です。
ログなどファイルサイズもどんどん変わりますし、このあとsedとかawkとか大活躍しそうな感じです:)


[log]# ls -Rl sa
sa:
total 4452
-rw-r--r-- 1 root root 265992 Nov 13 23:50 sa13
-rw-r--r-- 1 root root 264244 Nov 14 23:50 sa14
-rw-r--r-- 1 root root 265992 Nov 15 23:50 sa15
-rw-r--r-- 1 root root 265992 Nov 16 23:50 sa16

stat(1)の利用

ファイルやファイルシステムの情報を表示するコマンドとしてstat(1)が存在します。
実行してみるとlsでの表示に比べると詳細な情報が表示されることがわかります。


# stat lua
  File: ‘lua’
  Size: 13208           Blocks: 32         IO Block: 4096   regular file
Device: ca01h/51713d    Inode: 15252       Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-09-12 04:15:57.000000000 +0900
Modify: 2014-09-12 04:15:57.000000000 +0900
Change: 2014-09-30 16:04:31.060567440 +0900

man pageをみてるとこのコマンドには –formatとか–printfというオプションがあるのですね。
(私が昔使ってた環境にはこんなオプションありませんでした・・・)
このオプションを用いると出力結果を自由に整形することができます。
おなじみのfind(1)と合わせて用いると可能性がずいぶんと広がってきます。

オーナー情報のみの表示

[log]# find .  -exec stat --printf '%U:%G %n\n' {} \;
root:root .
root:root ./sa
root:root ./sa/sar14
root:root ./sa/sa20
root:root ./sa/sar13

パーミション情報のみの表示


[log]# find .  -exec stat --printf '%a %n\n' {} \;
755 .
755 ./sa
644 ./sa/sar14
644 ./sa/sa20

他にもファイルのatime/ctime/mtimeだけを表示したり、区切り文字をtabにしてパースしやすくしてみたりという事もできます。

ちょっとした応用

たとえば冒頭でのシチュエーションに戻れば
フォーマットの指定に下記のような文字で書けば、あとで再利用したりもできますね。


# find . -exec stat --printf 'chown %U:%G %n\n' {} \;
chown root:root .
chown root:root ./elfdeps
chown root:root ./pythondeps.sh
chown root:root ./perldeps.pl
chown root:root ./fileattrs
chown root:root ./fileattrs/font.attr
chown root:root ./fileattrs/perllib.attr
chown root:root ./fileattrs/elf.attr
chown root:root ./fileattrs/pkgconfig.attr
chown root:root ./fileattrs/python.attr
chown root:root ./fileattrs/ocaml.attr
chown root:root ./fileattrs/appdata.attr
chown root:root ./fileattrs/perl.attr
chown root:root ./fileattrs/libsymlink.attr
chown root:root ./fileattrs/mono.attr
chown root:root ./fileattrs/desktop.attr
chown root:root ./fileattrs/libtool.attr
chown root:root ./fileattrs/script.attr
chown root:root ./find-provides


# find . -exec stat --printf 'chown %U:%G %n\n' {} \;
chown root:root .
chown root:root ./elfdeps
chown root:root ./pythondeps.sh
chown root:root ./perldeps.pl
chown root:root ./fileattrs
chown root:root ./fileattrs/font.attr
chown root:root ./fileattrs/perllib.attr
chown root:root ./fileattrs/elf.attr
chown root:root ./fileattrs/pkgconfig.attr
chown root:root ./fileattrs/python.attr
chown root:root ./fileattrs/ocaml.attr
chown root:root ./fileattrs/appdata.attr
chown root:root ./fileattrs/perl.attr
chown root:root ./fileattrs/libsymlink.attr
chown root:root ./fileattrs/mono.attr
chown root:root ./fileattrs/desktop.attr
chown root:root ./fileattrs/libtool.attr
chown root:root ./fileattrs/script.attr
chown root:root ./find-provides

そんなに多く出番があるとは私も思っていませんが、知っているとちょっとだけ幸せになれるかもしれません。

投稿者プロフィール

えんじにあん
インフラ系のエンジニアです。
運用系のスクリプトを書いたり、オートメーションな世界に向かって日々精進しています。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

インフラ系のエンジニアです。 運用系のスクリプトを書いたり、オートメーションな世界に向かって日々精進しています。