検索結果を独自フォーマットで出力したい
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は以下のような場面で役立つ。
- ファイルサイズや更新日時を含めた一覧をレポートとして出力したい場合
sortやawkなどのコマンドに渡すため、タブ区切りやCSV形式で出力したい場合- パーミッションや所有者を一括で確認したい場合
更新日時を基準にファイルを検索したい場合は【find -mtime】指定日数より古い(新しい)ファイルを検索する も参照。
ファイルサイズを基準に検索したい場合は【find -size】指定サイズ以上(以下)のファイルを検索する も参照。
\第一線のプログラマーの行動原理を学べる!/
