ShellScript
Mac
Linux
shell
find

findでファイル名のみ表示

More than 1 year has passed since last update.

はじめに

findを普通に使うと, 以下のようにディレクトリとともに出力されるが,
ファイル名のみ抽出したい場合がある.

$ find . -type f
./path1/to1/file1.pl
./path2/to2/file2.rb
./path3/to3/file3.py
./path4/to4/file4.php
./path5/to5/file5.js

自分がよく使う方法

方法①

以下のように, findの後にパイプでAWKに渡すと, ファイル名のみ出力できる.

$ find . -type f | gawk -F/ '{print $NF}'
file1.pl
file2.rb
file3.py
file4.php
file5.js

(コメント欄でご指摘いただいた方法)

方法②

sedでも可 1

$ find . -type f | sed 's!^.*/!!'

その他の方法

方法③

まず, findでファイル名のみを表示する方法としては,
basenameを使った以下のような方法が最初に思いつく.
ただし, BSDのbasenameでは問題ない一方で, GNUのbasenameではエラーを出す.
これは, xargsは複数の引数をまとめて渡すにもかかわらず,
GNUのbasenameは引数を1つしか取れないためらしい.

find . -type f -print0 | xargs -0 basename # BSD版のみ

方法④

そこでxargs-nオプションを使って,
basenameに引数を1つずつ渡す以下のような方法が思いつく.
しかし当然, 対象のファイル数が膨大であれば処理が遅い.

find . -type f -print0 | xargs -0 -n1 basename # BSD版でもGNU版でも使えるが, 遅い

方法⑤

また, GNU版のfindでは-printfオプションを使って, 以下のように簡潔に書ける. 2

find . -type f -printf '%f\n' # GNU版のみ

確認環境

  • Ubuntu 12.04: GNU findutils 4.4.2 (find, xargs), GNU coreutils 8.13 (basename)
  • Mac OS X 10.7.5: BSD (find, xargs, basename)

参考

find: -exec vs xargs (aka Why does “find | xargs basename” break?)


  1. sedよりawkの方がコマンドが長くなるが, 個人的に意味が分かりやすいので,
    awkによる方法を使っている. 

  2. 個人的には, 使い分けるのが煩わしいので,
    最初に書いたawksedによる方法を使っている.