LoginSignup
97
89

findでファイル名のみ表示

Last updated at Posted at 2013-02-28

はじめに

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)

参考

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

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

97
89
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
97
89