ターミナルからfindコマンドを実行するときに、ファイル名だけのリスト(パスの残りの部分なし)を取得しようとしています。Macでこれを実現するにはどうすればよいですか?
ターミナルからfindコマンドを実行するときに、ファイル名だけのリスト(パスの残りの部分なし)を取得しようとしています。Macでこれを実現するにはどうすればよいですか?
回答:
ベース名付き:
find . -type f -exec basename {} \;
;
は-exec
アクションを終了します。シェルにとっても特別な意味\
があるため、これが必要です;
。
Evilsoupは、投稿されたものは、間隔を空けたファイル名では機能しないと述べました。したがって、代わりに使用できます:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
GNU findを使用すると、次のことができます。
find ~/tmp/ -printf "%f\n"
これはおそらくOS Xでも試してみる価値があります。
-printf
OS XのBSDではサポートされていませんfind
。
-printf
C printf
またはPOSIXシェルユーティリティとはほとんど関係ありませんprintf
。別の何かにこの歴史的な関数名を使用することは、ほとんど考慮されていません。保守的なBSDの連中は同じように見ている可能性が高いので、おそらく-printf
その名前でBSD findのクローンを見ることはないでしょう。
ファイルパスの最後の部分を除くすべてを削除するより良い方法があります。awkで。awkはすべてのファイルに対して1回実行されるわけではないため、より良い方法です。これは重要な場合があります。
find ~/tmp/ -type f | awk -F/ '{ print $NF }'
〜/ tmp内のファイルのみを検索し、すべてのエントリがスラッシュで区切られたリストを取得します。したがって、スラッシュをフィールド区切り記号(-F /)として使用し、最後のフィールド($ NF)に対応するフィールドパラメーター($ 1 .. $ 9)を出力します。
編集:
を使用して sed
:
$ find . -type f | sed 's/.*\///'
@nerdwallerの応答で述べたように、xargsコマンドを使用する
$ find . -type f -print0 | xargs --null -n1 basename
find . -type f -print0| xargs --null -n1 basename
--null
か-n1
のオプションは、OSX上で利用可能である
これはどうですか:
find … | egrep -o -e '[^/]+$'
利点:結果ごとに1つではなく、追加プロセスが1つだけ生成されます。