ディレクトリ内のすべてのファイルに対してfindを使用しているので、パスのリストが得られます。しかし、私はファイル名だけが必要です。すなわち、私は./dir1/dir2/file.txt
を取得し、私はfile.txt
を取得したいです。
GNU find
では、そのために-printf
パラメータを使用できます。
find /dir1 -type f -printf "%f\n"
あなたの検索が-printfオプションを持っていない場合は、basenameを使うこともできます。
find ./dir1 -type f -exec basename {} \;
現在のファイルを自動的に-execdir
に保持する{}
を使用します。次に例を示します。
find . -type f -execdir echo '{}' ';'
$PWD
の代わりに.
を使用することもできます(一部のシステムでは、先頭に余分なドットが生成されません)。
それでも余分なドットがある場合は、代わりに次のコマンドを実行することもできます。
find . -type f -execdir basename '{}' ';'
-execdir utility [argument ...] ;
-execdir
プライマリは-exec
プライマリと同じですが、ユーティリティは現在のファイルを保持するというディレクトリから実行されます。
+
の代わりに;
を使用すると、{}
はutilityが呼び出されるたびにできるだけ多くのパス名に置き換えられます。つまり、1行にすべてのファイル名を表示します。
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
ファイル名に対してのみ何らかのアクションを実行したい場合は、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
Mac(BSD find
)では以下を使用してください。
find /dir1 -type f -exec basename {} \;