検索結果を独自フォーマットで出力したい

findコマンドは通常ファイルパスのみを出力するが、ファイルサイズや更新日時、パーミッションなども合わせて確認したい場合がある。findコマンドの-printfオプションを使うと、検索結果の出力フォーマットを自由にカスタマイズできる。

次の2つのファイルがあるとする。

$ ls -l
-rw-r--r-- 1 root root   12 Jun  1 10:00 report.txt
-rwxr-xr-x 1 root root   12 Jul  1 09:30 script.sh

%p と %s でパスとサイズを出力する

%pはファイルパス、%sはファイルサイズ(バイト単位)を表すフォーマット指定子。

$ find . -type f -printf '%p %s\n'
./report.txt 12
./script.sh 12

%f でファイル名のみを出力する

%pがディレクトリ部分を含むパス全体を出力するのに対し、%fはファイル名のみを出力する。

$ find . -type f -printf '%f\n'
report.txt
script.sh

%m でパーミッションを8進数で出力する

%mを使うと、パーミッションをchmodで指定する形式と同じ8進数で出力できる。

$ find . -type f -printf '%m %p\n'
644 ./report.txt
755 ./script.sh

%TY や %Tm などで更新日時を出力する

%Tの後に日時のフォーマット指定子を続けると、更新日時を任意の形式で出力できる。%TYは年、%Tmは月、%Tdは日、%THは時、%TMは分を表す。

$ find . -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n'
2026-06-01 10:00 ./report.txt
2026-07-01 09:30 ./script.sh

タブ区切りでCSVのような出力にする

フォーマット文字列に\tを含めると、タブ区切りの出力を作成できる。sortコマンドと組み合わせれば、サイズ順にファイルを並べ替えることも可能である。

$ dd if=/dev/zero of=large.bin bs=1k count=200
$ touch -d "2026-07-03 08:00:00" large.bin

$ find . -type f -printf '%TY-%Tm-%Td\t%s\t%p\n' | sort -rn -k2
2026-07-03	204800	./large.bin
2026-06-01	12	./report.txt
2026-07-01	12	./script.sh

更新日時・サイズ・パスをタブ区切りで出力し、サイズの降順に並べ替えている。

主なフォーマット指定子

-printfで使用できる主なフォーマット指定子は次のとおり。

指定子意味
%pファイルパス
%fファイル名のみ
%sファイルサイズ(バイト)
%mパーミッション(8進数)
%u所有者のユーザー名
%g所有者のグループ名
%yファイルタイプ(fは通常ファイル、dはディレクトリなど)
%TY %Tm %Td %TH %TM %TS更新日時の年・月・日・時・分・秒
\n改行

用途

-printfは以下のような場面で役立つ。

  • ファイルサイズや更新日時を含めた一覧をレポートとして出力したい場合
  • sortawkなどのコマンドに渡すため、タブ区切りやCSV形式で出力したい場合
  • パーミッションや所有者を一括で確認したい場合

更新日時を基準にファイルを検索したい場合は【find -mtime】指定日数より古い(新しい)ファイルを検索する も参照。

ファイルサイズを基準に検索したい場合は【find -size】指定サイズ以上(以下)のファイルを検索する も参照。