web-dev-qa-db-ja.com

Linuxの `find`でファイル名だけを取得するにはどうすればいいですか?

ディレクトリ内のすべてのファイルに対してfindを使用しているので、パスのリストが得られます。しかし、私はファイル名だけが必要です。すなわち、私は./dir1/dir2/file.txtを取得し、私はfile.txtを取得したいです。

227
marverix

GNU findでは、そのために-printfパラメータを使用できます。

find /dir1 -type f -printf "%f\n"
303
SiegeX

あなたの検索が-printfオプションを持っていない場合は、basenameを使うこともできます。

find ./dir1 -type f -exec basename {} \;
141
Kambus

現在のファイルを自動的に-execdirに保持する{}を使用します。次に例を示します。

find . -type f -execdir echo '{}' ';'

$PWDの代わりに.を使用することもできます(一部のシステムでは、先頭に余分なドットが生成されません)。

それでも余分なドットがある場合は、代わりに次のコマンドを実行することもできます。

find . -type f -execdir basename '{}' ';'

-execdir utility [argument ...] ;

-execdirプライマリは-execプライマリと同じですが、ユーティリティは現在のファイルを保持するというディレクトリから実行されます。

+の代わりに;を使用すると、{}はutilityが呼び出されるたびにできるだけ多くのパス名に置き換えられます。つまり、1行にすべてのファイル名を表示します。

22
kenorb

GNU findを使用している場合

find . -type f -printf "%f\n"

あるいは、Ruby(1.9+)などのプログラミング言語を使用することもできます。

$ Ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}'

あなたがbash(少なくとも4)の解決策を好むなら

shopt -s globstar
for file in **; do echo ${file##*/}; done
21
kurumi

ファイル名に対してのみ何らかのアクションを実行したい場合は、basenameを使用するのは困難です。

例えばこれ:

find ~/clang+llvm-3.3/bin/ -type f -exec echo basename {} \; 

ベース名/my/found/pathをそのままエコーします。ファイル名で実行したいのであれば、望んでいることではありません。

しかし、あなたはその出力をxargsすることができます。たとえば、あるディレクトリ内のファイルを別のディレクトリ内の名前に基づいて削除するには、次のようにします。

cd dirIwantToRMin;
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \; | xargs rm
11
j03m

Mac(BSD find)では以下を使用してください。

find /dir1 -type f -exec basename {} \;
5
spectrum