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


13

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

回答:



6

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

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

これは、名前にスペースが含まれるファイルで中断します(gregのwikiでlsの解析を参照)
evilsoup

速度のために+1。私が何か間違ったことをしたかどうかはわかりませんが、これは$ HOMEで1秒かかりましたが、他のすべては約10秒かかりました。もちろん、これを調べて入力するには10秒以上必要です。
パウロアルメイダ

2

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

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

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


2
-printfOS XのBSDではサポートされていませんfind
ダニエルベック

1
また、-printfC printfまたはPOSIXシェルユーティリティとはほとんど関係ありませんprintf。別の何かにこの歴史的な関数名を使用することは、ほとんど考慮されていません。保守的なBSDの連中は同じように見ている可能性が高いので、おそらく-printfその名前でBSD findのクローンを見ることはないでしょう。
カズ

よく知られている関数名を使用して、異なるコンテキストで同様のタスクを実行することはあまり考慮されていないことに同意しません。なぜBSDがサポートしないのかは別問題です。
ЯрославРахматуллин

2

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

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

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


これは私がテストした最速です。
パウロアルメイダ

最近Cygwinを使用していますが、Windowsでプロセスを作成するのは非常に高価です...
–рославРахматуллин13年

2

編集

を使用して sed

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

@nerdwallerの応答で述べたように、xargsコマンドを使用する

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

1
+1を指摘してくれてありがとう、xargsはあまり使用していません。
オタクウォーラー

ファイルにスペースがある場合、これは壊れます。それは、少なくとも簡単なテストでは、このように動作します:find . -type f -print0| xargs --null -n1 basename
パウロ・アルメイダ

どちら--null-n1のオプションは、OSX上で利用可能である
バレリー・ヴァン・


0

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

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.