web-dev-qa-db-ja.com

findコマンドからファイル名のみを返すにはどうすればよいですか?

端末からfindコマンドを実行するときに、ファイル名(パスの残りの部分なし)だけのリストを取得しようとしています。 Macでこれを行うにはどうすればよいですか?

14
blueberryfields

ベース名あり:

find . -type f -exec basename {} \;

18
Paulo Almeida

Evilsoupは、投稿されたものが空白のファイル名に対して機能しないと述べました。したがって、代わりに次を使用できます:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
6
nerdwaller

[〜#〜]編集[〜#〜]

sedの使用:

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

xargs コマンドを使用する(@nerdwallerの応答で言及)

$ find . -type f -print0 | xargs --null -n1 basename
2
stderr

GNU findを使用すると、次のことができます。

 find ~/tmp/ -printf "%f\n"

これはおそらくOS Xでも試す価値があります。

ファイルパスの最後の部分を除いてすべてを取り除くより良い方法があります。 awkで。すべてのファイルに対してawkが1回実行されるわけではないため、これはより良い方法です。これが重要な場合もあります。

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

〜/ tmp内のファイルのみを検索し、すべてのエントリがスラッシュで区切られたリストを取得します。したがって、フィールド区切り記号としてスラッシュを使用し(-F /)、最後のフィールド($ NF)に対応するフィールドパラメーター($ 1 .. $ 9)を出力します。

これはどうですか:

find … | egrep -o -e '[^/]+$'

利点:生成される追加プロセスは1つだけで、結果ごとに1つは生成されません。

1
David Foerster

Findの-execオプション内からshを呼び出し、不要なパイプの使用を回避できます。これには、おかしなファイル名(スペース、改行など)を気にする必要がないという利点もあります。

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
0
evilsoup