find完全終了のお知らせ!? 超速くて使いやすい代替ツール「fd」が話題に
引用元:https://news.ycombinator.com/item?id=43410692
sharkdpさんの大ファン!bat, fd, hexyl, hyperfine、毎日使ってるよ。マジ感謝!エンジニアのみんな、月10ドルずつでも良いから、sharkdpさんみたいな才能ある開発者を支援したら、インターネットはもっと良くなると思うんだ。素晴らしいツールがたくさんあるし、みんなでエコシステムをサポートしようぜ。
え、batとfdとhyperfineって全部同じ人が作ってるの?!マジか、どれもめっちゃ愛用してるんだけど。
David PeterはAstralで働いてるみたい。ripgrepのAndrew Gallantもいるし。RustのCLIツールにとって夢のチームじゃん。
Andrew Gallant、別名BurntSushiのxsvにはマジで感謝しかない。長いファイルをN行ずつのチャンクに分割するのに、他にこんな便利なツールないもん。[1]標準のsed/head/tailじゃ無理だったんだよね。rust-csvライブラリのラッパーであるコマンドラインユーティリティを使ってたんだけど、RustでCSVパースが必要なら、このライブラリ超おすすめ。
watch ”xsv select … | xsv table”を何時間も見てたわ。
CSV処理自体はそんなに変わらないかもしれないけど、xsvリポジトリはしばらくメンテナンスされてないみたい。
これはアクティブなフォークだよ: https://github.com/dathere/qsv
フォークだって知らなかった。qsvはマジで最高。4Gbのファイルをたくさん解析して、マジで助かった。
DSQってのもあるよ。独自の言語じゃなくてSQLを使うんだ。
https://github.com/multiprocessio/dsq
ソフトウェアが機能的に完成してて、速くて、正常に動作してるなら、他に何を変える必要があるの?
えーと、未解決の問題が131件、PRが30件以上もあるってことは、みんな何かしら変更を望んでるってことだよね。作者さんを批判するつもりはないよ。僕なんかよりずっと生産的だし。でも、xsvは後回しにされてるみたいだね。オープンソースだから、作者さんは好きなように時間を使えるし、僕らは何も要求できないけどね。
まさに言おうと思ってたんだけど、fdとbatの作者は、burntsushi (xsv, rg)を思い出すね。*nixのコマンドラインのエコシステムに多大な貢献をしてるって意味で。
uv
を作ったAstralと同じ人たち?マジか、この人たちは「物事をめっちゃ速くする」ことに特化してるんだね!
ちょっと話題がずれるけど、Astralはどうやってお金を稼いで開発者を養ってるんだろう?
Astralは主にベンチャーキャピタルから資金提供を受けてるんだ。トップのCharlieは、Astralのオープンソースツールとうまく連携できるサービスを開発して販売したいって何度か言ってたよ。でも、具体的なことはまだ何も決まってないし、発表もされてないけどね。
良いユーティリティソフトの書き方のチュートリアルを書くか、教えるべきだよね。
彼のウェブサイトによると、やってるみたいだよ。
https://shark.fish/rustlab2019
完全に同意だよ。fdみたいなツールがもっと広まるといいね!うちらは前にfdの開発を支援したことがあって、たまにだけどTerminal Troveでターミナルツールの作者さんたちを支援してるんだ。今はzellijを支援してるから、ぜひチェックして応援してあげて!
Terminal Troveって知らなかった。めっちゃ役立つターミナルツールを集めててすごいね。これ、HNで別途投稿する価値ありそう。
zellijにはマジで同意。オレはずっとscreen使ってて、その後tmux使ってたんだけど、zellijはなんかシックリくるんだよね。マジで最高。 Zellijとtmuxの何がそんなに違うの?ゲームチェンジャーって感じ? 他のプロジェクトと似てて、Zellijは初期設定がマジで良いんだよね。初めてZellijを起動すると、やりたいことのメニューが全部出てくる。あと、マウスホイールでのスクロールがデフォルトでサポートされてて、しかもほぼ100%ちゃんと動くのがデカい。tmuxとかscreenでできることが全部できるかは分からんけど、オレがやりたいことは全部できるし、設定もいらない。 へー、面白いね。オレがZellijを試したときは、メニューが多すぎてウザく感じたんだよね。tmuxとかscreenのミニマルなデザインの方が好き。最初は良いのかもしれないけど、ずっと使ってるとclippyみたいに邪魔にならないかなって思った。まあ、この機能がtmuxより優れてるって思う人がいるのも分かる。ソフトウェアの多様性って大事だね。 それ、めっちゃ分かるわ。オレもEmacs使うけど、ツールバーとか全部オフにしてるし。tmuxヘビーユーザーってわけじゃないんだ。リモートマシンでセッションを維持したり、タブを切り替えたりするくらいかな。tmuxでそれ以上のことをしようとすると毎回マニュアル読まなきゃいけないけど、Zellijならメニューバーで簡単に発見できる。 Zellijの唯一気に入らないデフォルト設定は、ctrl-qでインスタンス全体が終了すること。 作者を特定してくれてありがとう。fdとbatの大ファンだけど、同じ人が作ったって知らなかった。他のツールもチェックしてみよう。 numbatもチェックしてみてよ。マジでヤバいから。 興味ある人のためのリンク:https://github.com/sharkdp おれが使ってるリポジトリのスポンサーを簡単に見つけられる方法があればいいのになー。weztermとかatuinみたいな、プロジェクトの依存関係じゃないけど毎日使うツールとか。 オープンソースにお金を出すのは当然だよね(別のスレッドからframasoftをスポンサーした)。trillonaireやbillionaire企業が、自分たちが使ってるフリーソフトをどれだけスポンサーしてるかも考えようぜ。 みんなterminaltrove.comを時々チェックすべきだと思う。find -> fd、time(ランタイム比較) -> hyperfine、grep->ripgrep、asciinema + .gif変換 -> t-rec[1]、手動でのconventional commits作成 -> koji[2]みたいな感じで、よく使うツールの簡単な代替品が見つかるよ。 ライセンスでフィルタリングできると嬉しいな。できる限り非(A)GPLツールは避けたいんだよね。 kojiは良いと思うけど、67桁の幅にこだわりたいんだよね。たぶんkojiじゃ無理?代わりにgit-cola使ってる。 わかる。おれも同じ問題がある。koji -> gitlint -> git commit –amend –editって感じで幅の問題を修正してる。 kojiの代わりに fdとrgのフラグ、もうちょっとなんとかならんかなー。–typeとか、fdだとファイルの種類だけどrgだとMIMEタイプだったり。fdには–extensionがあるのにrgにはなかったりするし。どっちも使う人多いと思うから、似たような名前にしてくれたら嬉しいんだけどな。 正直、POSIXツールから離れられない理由の一つがこれなんだよね。新しいツールとそのフラグを覚えるのが面倒くさくて。もう体が覚えちゃってるし。新しいツール使うより、今のツールで我慢しちゃうかな。 ripgrep作者だけど、それには納得いかないな。sedの-iフラグ使ったことある?あれPOSIXじゃないんだよ。POSIXツールって言うけど、実際はスーパーセット使ってるでしょ。findの-Lとgrepの-Rみたいに、フラグもバラバラだし。fdとripgrepは-Lで統一してるから、よっぽどマシだよ。 >ripgrep作者だけど、それには納得いかないな。sedの-iフラグ使ったことある? まあ、そりゃそうかもね。ちょっと残念だけど、それもアリだよね。>面倒くさい うん、わかるよ。自分もオッサンでめんどくさがりだけど、新しいツール試す時間はあるかな。findって、一発で思った通りに動いたことないんだよね。何年も使ってるのに。ツールが悪いんじゃないかって疑うべきかもね。 自分もオッサンでめんどくさがりだから、ezaとかbatとか新しいツール使ってるよ。なんで80年代のツールしか使えないみたいなことになってるの? 残念じゃないよ。現実的なだけ。子供もいるし、オープンソースのプロジェクトもやってるし、フルタイムの仕事もしてるし。時間がないから、一番インパクトのあることに集中してるんだ。 いやいや、めっちゃ残念だよ!新しいことを学ぶのは良いことだと思うんだよね。ローカル最適に陥りやすいし。自分も子供とか色々あるけど、時間見つけてやってるよ。tmuxとかzshとか。 君のシェルを学ぶ時間があるなら、ripgrepを学ぶ時間を作るよ! https://murex.rocks マジかよ、それフェアじゃなくね? ripgrepはGNU grepと互換性のあるコマンドで、使い方も簡単だよ。でも、ちょっと時間かけてdotfilesの一部を移植してみた。 起動時間の最適化はまだなんだ。インタラクティブシェルがメインだからね。PowershellとかJVMみたいな感じで、インタラクティブに使えば起動は一回だけだし。でも、改善の余地はあるかも。 最初はシェルスクリプトから入るのが良いと思ったんだ。それからインタラクティブな使い方に移行する感じで。エラーメッセージはすごくいいね。 シェルを変えるのは大変だよね。デフォルトのままなのも無理ないよ。ripgrepも最初は乗り気じゃなかったし。Murexとripgrepの交換はフェアじゃなかったけど、試してくれて感謝してるよ。 ripgrepに置換機能があって助かる。sedの標準じゃないファイル内置換に悩まなくて済むし。MacにGNU sedをインストールすることもできるけど、どうせならripgrepの方が良いよね。 残念だけど、ripgrepは書き込みしないんだ。-r/–replaceオプションは出力だけを制御して、ファイルの中身は変えないよ。 え、前はそれで置換できた気がしたんだけど、勘違いかな? replaceオプションがあって嬉しかったのは覚えてる。 ripgrepの出力をファイルに書き込むツール(rep-grep)と、fdの出力でファイル名を変更するツール(ren-find)を作ってるよ。 >ripgrepが書き込みしないなら、ミスでファイルを壊す心配もないのか。 sedは最悪のPOSIXツールのひとつだね。簡単そうに見えて、いつも期待通りに動かない。やりたいことに合わなかったり、そもそも対応してなかったり(特に複数行の置換とか)。sdに乗り換えたら、毎回期待通りに動くようになったよ。 ripgrepってマジでunixのツールボックスのめんどい問題を解決してくれてるよねー。ファイルの検索方法がいちいち違うの何なの?find -name -execとかfind -name | xargs -n 1とか?しかもファイル名にスペース入ってたらfind -name -print0 | xargsとか試さないといけないけど、-print0はPOSIXじゃないから一部のunixでは使えないし!locate vs slocate vs mlocateとかマジ勘弁!ファイル関係マジでクソ。 tab補完とtldrがあるじゃん。大体のケースはそれでカバーできるし、フラグ名見れば大体わかるし。CLIツールが優秀ならね。例えば”fd -e png -x optimize-png {}”とか簡単じゃん。fdの嫌なところは、”Downloads”の中身全部見たい時に”fd . Downloads”って書かないといけないところかな。パターン省略させてほしい。 互換性維持してるからこそ問題が起きるんだよねー。fdとfind -typeは同じ意味だけど、この人は違う意味で使いたいんだもん。AI shell completion使ってるから、もっとスムーズだけどね。 fdとrg毎日使ってるけど、マジでこれイライラするんだよね。フラグが部分的に一致してたりするから、もっと混乱するんだよね。例えば、globパターンよく使うんだけど、fdとrgで-gフラグの挙動が違うし。fdの-gフラグは”full-path” globbingじゃないけど、rgの-gはそう(逆かも)。fdでrgみたいなglob使うには-pフラグも必要だし。rgも-p認識するけど、全然違う意味だし。今更互換性崩さずに直すのは無理だよね。 難しいバランスだよね。–typeの例で言うと、rgとは一貫性がないけど、findとはほぼ一貫性がある。fdの–typeオプションはrgよりもfdの方が便利だし。grepするファイルをディレクトリやソケットに絞るのは意味ないけど、ファイル名検索とか特定のファイルを検索するなら便利だもん。rgの–typeオプションはfdだと、そこまで便利じゃないし。fdはファイル名に対してパターンマッチしてるから、拡張子を検索パターンに追加すればいいだけだし。–exyensionフラグもあるし。 フラグじゃなくてSQL使って覚えやすくしたよー。https://github.com/laktak/zfind もしfd、bat、numbat、hexyl、hyperfineを試したいなら、Terminal Troveで簡単にインストールできるし、スクリーンショットも見れるよ!fdはhttps://terminaltrove.com/fd/、batはhttps://terminaltrove.com/bat/、numbatはhttps://terminaltrove.com/numbat/、hyperfineはhttps://terminaltrove.com/hyperfine/、hexylはhttps://terminaltrove.com/hexyl/だよ。スクリーンショット付きでインストールできるように頑張ってるんだ。 クールなサイトだね!スクリーンショットの代わりにasciicinemaを使うのってどうかな?君たちがやろうとしてることにピッタリだと思うよ。https://asciinema.org/ このサイトのいくつかのツールをクリックしてみたけど、全部デモのGIFがあったよ。terminaltroveは、自分たちで作るんじゃなくて、プロジェクト自体から持ってきてるんじゃないかな。 もっといろいろツールを試してみたいなぁ。最近はmise(リストにもあるね)で全部インストールしてるんだ。miseコマンドがあると嬉しいな。「mise use -g fd」とか、レジストリにないツールなら「mise use -g cargo:xyztool」みたいなバックエンドの使い方とか。 https://github.com/xtermjs/xterm.jsみたいなのを使えば、TUIアプリのインタラクティブなセッションを見せられるかもね。 良い提案だね!numbatとhyperfineは絶対試してみるよ(fdは毎日使ってる)。batは長いパイプ処理の最後に使うと便利かもね。xxdが好きだからhexylはパスかな。 bat、exa、fdみたいな最近のRust製のツールをなかなか使い始められない理由の一つは、オリジナルのオプションをほとんど覚えられないからなんだよね。 >One reason I haven’t picked up any of these newfangled Rust tools like bat, exa, or fd is that I can barely remember the options for the originals.” 告白すると、findを使ったことと言えば、ツリーを歩いてgrepにパイプして探してるだけだ。 fdはほとんどのタスクで便利だけど、findより面倒なこともある気がする。例えば、キャッシュディレクトリの中のファイルを全部削除するのに、見つけられた一番簡単な構文はこれだった。 確かにその方が安全そうだね。 ツールがどの言語で書かれてるかなんてマジでどうでもいい。良いツールなら使えばいいんだよ。 >ツールがどの言語で書かれてるかなんてマジでどうでもいい。 ちょっと話が逸れるけど、 >オリジナルのツールのドロップインリプレースメントにならないものは、摩擦が大きくて使う価値がない。 全面的に賛成。Ubuntuがそれを採用して、互換性の問題が何も起こらないなら、みんなにとってWin-Winだね。 それって、IPアドレスが“フレンドリー”とみなされない限り、基本的なコンピューターユーティリティを使えないってこと?Gnu utilsの方がアクセスしやすい(長期的には自由度が高い)気がする。もっとコメントを表示(1)
結論:その通り!両方あって良かった!
[1]https://terminaltrove.com/t-rec/
[2]https://terminaltrove.com/koji/aider --commit
を使ってる。
あるよ。でも、そんなの例外じゃん。grepの話だし。sedは自分で作ったし。UNIXツールもめちゃくちゃだし。記憶の問題なのよ。新しいツールを覚える時間がないから。もっとコメントを表示(2)
って言ってたし、それもわかるよ。
最近tmux control modeについて学んだよ。
起動時間が結構かかるのが気になる。もしかして環境の問題かな?
>ああ、新しいことを学ぶのは全然ウェルカムだよ。
え、さっきのコメントと矛盾してない?
>え、さっきのコメントと矛盾してない?
そんなことないよ。新しいことを学ぶのは嫌じゃないけど、覚えちゃったツールの代わりは探したくないだけ。
とりあえずripgrep使ってみるよ。
最近、標準じゃないシェルも検討してるんだよね。Bourne shellとその派生は好きじゃないけど、zshはまだマシかな。fish, nushell, oilsも候補だけど、nushellは前試したときなんか合わなかった。
そうか、ripgrepが書き込みしないなら、ミスでファイルを壊す心配もないのか。
そう、まさにそれが理由。
-r/–replaceフラグはsedやawkの代わりになることもある。少なくとも俺はそう。もっとコメントを表示(3)
俺にとっては、オリジナルのツールのドロップイン・リプレースメントじゃないと、摩擦に見合わないんだ。VS Codeの中ではripgrepを使ってるけど、コマンドラインでは長年の筋肉記憶でvanilla grepを使ってるし。
とは言え、ツールが何語で書かれていようと、動けば気にしないよ。お気に入りのUnixツールの一つにGNU Stowがあるけど、Perlで書かれてるし。これらのRustツールがドロップイン・リプレースメントだとしても、手動でインストールしようとは思わないだろうな。ユーザーとしては、速度の向上やメモリ安全性は、あんまり重要じゃないんだ。
Goみたいにメモリ安全性が保証されてる言語もあるし、Goのパフォーマンスはツールには十分すぎるくらいだよ。しかも、コミュニティからの参加も得やすいし。だから、「Rustこそ救世主」みたいな話には、全然納得できないんだよね。
とは言え、macOSやUbuntuが、OGツールをRust製の代替ツールにそっくりそのまま置き換えたとしても、ワークフローが邪魔されなければ、文句は言わないと思うよ。
まさにそれが新しいツールを使う理由だよ。特にfdはfindよりもずっと分かりやすい。UNIXを30年以上使ってるけど、findは全然ピンとこなかった。
fd -t f -X rm {} ; ^ cache
これ、めっちゃ怖いんだよね。だからいつもfindに頼っちゃう。
find cache -type f -delete
これなら何十年も使ってるから安心できるんだ。fdでこれと同じくらい安心できる方法ってないかな?fd -t f . cache -X rm --
って書くと、findでファイル検索して、cache
ディレクトリの中から.
にマッチするファイルを見つけて、見つかったファイルを引数にしてrm --
を実行するのと同じ意味になるよ。ファイル名が-
で始まる場合でも、オプションとして解釈されないから安全だよ。絶対パスを使いたい場合は-a
オプションも使えるけど、今の例だと相対パスでも問題ないと思うよ。-X
オプションを最後に書けるって知らなかった。マニュアルには「Usage: fd [OPTIONS] [pattern] [path]…」って書いてあるから、パスは最後に書かないといけないと思ってた。fd
はほぼ全ての面でfind
より優れてる。デフォルト設定もイケてるし、めっちゃ速いし、オプションも簡単(忘れたらcht.sh
使えばOK)。俺はfind
を使う理由がマジでない。新しいシステムに入ったら、まずfd
をインストールする。
いやいや、言語は結構大事だよ。fd
やrg
みたいなツールは、Javaで書かれた同じようなツールがJVMを起動する前に終わっちゃうことだってあるし。Java製のソフトはたくさんあるけど、CLIの世界では全然見かけないよね。
>俺はfind
を使う理由がマジでない。新しいシステムに入ったら、まずfd
をインストールする。
今度こそfind $path -name '*.$ext' -exec nvim {} +
を置き換える方法を探してみるか…って、fd -e $ext -X “nvim” “” $path
でいけるのか。cargo
が優秀すぎて、最近はRust製のツールをインストールするのにパッケージマネージャーの代わりに使ってる。
”uutils
プロジェクトは、一般的なコマンドラインユーティリティをRustで再実装するプロジェクトです。既存のユーティリティとの完全な互換性を維持しながら、モダンなユーティリティを目指しています。Linuxの必須ツールを全て置き換える予定です。” uutils
はUbuntu 25.10で採用されるらしい。