はじめに
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)
参考