{"id":37532948,"url":"https://github.com/maxkagamine/wsl-tools","last_synced_at":"2026-03-13T23:10:42.858Z","repository":{"id":284786363,"uuid":"949028796","full_name":"maxkagamine/wsl-tools","owner":"maxkagamine","description":"Clipboard (xsel), recycle, and open commands for WSL written in Rust + options to make \"Open with Code\" open in WSL and add \"Run\" to .sh files.","archived":false,"fork":false,"pushed_at":"2025-12-30T12:52:03.000Z","size":262,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-02T08:53:32.085Z","etag":null,"topics":["cli","clipboard","command-line","linux","recycle-bin","rust","trash","windows","wsl"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxkagamine.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-15T14:11:32.000Z","updated_at":"2025-12-30T12:49:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"b5ce864f-2403-43f1-9928-4b56f1811a42","html_url":"https://github.com/maxkagamine/wsl-tools","commit_stats":null,"previous_names":["maxkagamine/wsl-tools"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/maxkagamine/wsl-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxkagamine%2Fwsl-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxkagamine%2Fwsl-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxkagamine%2Fwsl-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxkagamine%2Fwsl-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxkagamine","download_url":"https://codeload.github.com/maxkagamine/wsl-tools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxkagamine%2Fwsl-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478047,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","clipboard","command-line","linux","recycle-bin","rust","trash","windows","wsl"],"created_at":"2026-01-16T08:34:11.632Z","updated_at":"2026-03-13T23:10:42.849Z","avatar_url":"https://github.com/maxkagamine.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\n  \u003cimg src=\"rustuxdows.svg\" height=\"80\" align=\"left\" /\u003e\n  wsl-tools\n  \u003cbr /\u003e\n  \u003csup\u003e\u003csub\u003e\n    \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e\n    \u0026nbsp;│\u0026nbsp;\n    \u003ca href=\"#インストール\"\u003eインストール\u003c/a\u003e\n    \u0026nbsp;│\u0026nbsp;\n    \u003ca href=\"#xsel\"\u003e\u003ccode\u003exsel\u003c/code\u003e\u003c/a\u003e\n    \u0026nbsp;│\u0026nbsp;\n    \u003ca href=\"#recycle\"\u003e\u003ccode\u003erecycle\u003c/code\u003e\u003c/a\u003e\n    \u0026nbsp;│\u0026nbsp;\n    \u003ca href=\"#open\"\u003e\u003ccode\u003eopen\u003c/code\u003e\u003c/a\u003e\n  \u003c/sub\u003e\u003c/sup\u003e\n\u003c/h1\u003e\n\nWSL用のRust製クリップボード（xsel）とごみ箱（recycle）とオーペン（open）のコマンドです。遅くて時々壊れる（Unicodeに正しく対応しないなど）PowerShellベースのソリューションにうんざりしたため、自作しました。私の他の作品と同様に人間製のコードです。\n\n特に、`recycle`は`rm`の代替として機能し、Freedesktop.orgのごみ箱（デスクトップLinuxディストリビューションの相当）をサポートします。詳細は[以下を参照](#recycle)してください。\n\nそれぞれのプログラムはLinuxバイナリもWindowsバイナリも含まれています。前者はパスの変換やパイプの確認を行った上で、WINAPIを呼び出すためにexeに処理を渡します。そのexeはWSL専用ではなく、バッチスクリプトなどで単独で使用することも可能です。\n\nボーナスとして、インストーラを使う場合、私は2つのオプションを追加しました：\n\n1. エクスプローラーからVS Codeを起動する際（ファイルをダブルクリックするか、コンテキストメニューの「\u003cimg src=\"https://code.visualstudio.com/assets/apple-touch-icon.png\" height=\"16\" align=\"center\" /\u003e Codeで開く」を選択する場合）、WSLで開くようにします。これは[小さなプログラム](src/bin/run-in-wsl.rs)を使用してパス変換を行い、WSL内の`code`シェルスクリプトと同じようにVS Codeを起動します。\n\n2. .shファイルのコンテクストメニューに「実行」を追加します。同様に、wsl.exeを実行するために[ヘルパーのプログラム](src/bin/run-in-wsl.rs)を使って、環境がターミナルからスクリプトを実行した場合と同じであるようにし、同時に引用符の問題を回避し、shebangを正しく扱うようにします。（※ Windowsターミナルでは、設定 → 既定値 → 詳細設定 → プロファイルの終了動作を変更すると自動的に閉じないようにできます。）\n\n## インストール\n\n\u003e [!IMPORTANT]\n\u003e Linuxファイルシステム上のexeは、Windows上のexeよりも実行速度が10倍遅くなる場合があります。特にWindows 11でこの問題が顕著だと感じました。面倒を減らすために、バイナリをProgram FilesにコピーしてPATHに追加するインストーラを作成しました。\n\n### [インストーラをダウンロード](https://github.com/maxkagamine/wsl-tools/releases/latest/download/wsl-tools-installer.exe)（おすすめ）\n\nまたは[ZIPをダウンロード](https://github.com/maxkagamine/wsl-tools/releases/latest/download/wsl-tools-portable.zip)、またはソースからコンパイル：\n\n1. [Rustをインストールして](https://rustup.rs/)（Windowsではなく、WSLで）\n2. [Inno Setup 6.6+をインストールして](https://jrsoftware.org/isdl.php)（任意）\n3. クロスコンパイルのために準備して：  \n   `cargo install --locked cargo-xwin \u0026\u0026 rustup target add x86_64-pc-windows-msvc`\n4. `make`を実行して\n\n## xsel\n\nLinuxでコピーしたり貼り付けたりするために使われる一般的なxselプログラムのドロップイン置換品です。多くのプログラムやクリップボードのライブラリがxselを探すため、これをPATHに入れるとWSLを意識していないソフトでもWindowsのクリップボードにコピーできるようになります。\n\n```\n使い方: xsel [オプション]\n\nデフォルトでは、標準入力と標準出力の両方がターミナル（tty）であれば、クリップボードの内容が出\n力されます。それ以外の場合は、標準出力がターミナル（tty）ではないとクリップボードの内容が出力\nされて、標準入力がターミナル（tty）ではないとクリップボードが標準入力から読み込まれます。入力\nオプションか出力オプションを使うと、プログラムが要求されたモードでのみ動作します。\n\n入力と出力が両方必要な場合は、標準入力の内容に置き換えられる前に、前のクリップボードの内容が出\n力されます。\n\n入力オプション\n  -a, --append            標準入力をクリップボードに追加する\n  -f, --follow            ＜サポートされない＞\n  -z, --zeroflush         ＜サポートされない＞\n  -i, --input             標準入力をクリップボードに読み込む\n\n出力オプション\n  -o, --output            クリップボードを標準出力に書き出す\n\n  --keep-crlf             ＜Windowsのみの追加＞ デフォルトでは、貼り付け時にCRLFがLFに\n                          置き換える。このオプションを指定すると無効にできる。\n\n操作オプション\n  -c, --clear             クリップボードをクリアする\n  -d, --delete            ＜サポートされない＞\n\nセレクションオプション\n  -p, --primary           PRIMARYとSECONDARYセレクションはWindowsに相当がないけど、\n  -s, --secondary         いくつかのLinuxクリップボードマネージャーがセレクションと\n  -b, --clipboard         クリップボードのバッファを同期させるから、このxselはそうだと\n                          ふりして、選んだセレクションを無視する\n\n  -k, --keep              ＜何もせずに終了＞\n  -x, --exchange          ＜何もせずに終了＞\n\nXオプション\n  --display               ＜サポートされない＞\n  -m, --name              ＜サポートされない＞\n  -t, --selectionTimeout  ＜サポートされない＞\n\nその他のオプション\n  --trim                  入力・出力の終わりから改行を消す\n  -l, --logfile           ＜サポートされない＞\n  -n, --nodetach          ＜無視される＞\n  -h, --help              このヘルプを表示して終了\n  -v, --verbose           ＜無視される＞\n  --version               バーション情報を表示して終了\n```\n\n## recycle\n\nファイルとディレクトリをインタラクティブに（エクスプローラから削除したかのように）ごみ箱に移動するか、または`rm`コマンドの代替として処理する（ごみ箱への移動を試行し、失敗した場合は完全に削除する）。Windowsのごみ箱が英語で「Recycle Bin」と呼ばれているため、この名前を付けました。詳しくは[ソースで注釈](src/recycle_bin.rs)を参照してください。[ベンチマークはここにあります。](https://github.com/maxkagamine/wsl-tools/releases/tag/v1.4.0)\n\nWSLファイルシステム上のファイルをごみ箱に移動しようとする場合（`--rm`を含む）、インストーラーで永久に削除するか、あるいは[Freedesktop.orgのごみ箱](https://specifications.freedesktop.org/trash/1.0/)（デスクトップLinuxディストリビューションの相当）を使用するかを選択できます。必須ではありませんが、後者を選ぶと、[**trash-cli**](https://github.com/andreafrancia/trash-cli)をインストールすることをおすすめします。これを使用して、ごみ箱から古いファイルを削除するcronジョブを設定できます（そのreadmeに示されているように）。\n\n\u003e [!TIP]\n\u003e ごみ箱のある場所でのファイルを誤って削除しないように、.bashrcなどで`rm`を`recycle`にエイリアスできます：\n\u003e ```bash\n\u003e alias rm='recycle --rm'\n\u003e ```\n\u003e シェルスクリプトはエイリアスを認識しないので、必要に応じて`recycle --rm`を使用するように修正する必要があります。例えば：\n\u003e ```bash\n\u003e if command -v recycle \u0026\u003e/dev/null; then\n\u003e   rm() { recycle --rm \"$@\"; }\n\u003e fi\n\u003e ```\n\u003e なお、[`rm`](https://linux.die.net/man/1/rm)の`-i`/`-I`と`-d`オプションは現在ここで実装されていません。\n\n\u003e [!NOTE]\n\u003e WSLファイルシステム上のファイルをごみ箱に移動しようとする時に「Element not found.」というエラーが出る場合は、`wsl.exe --update`を実行、および/または再起動してみてください。これはWSLの古いバージョンのバグです。（[microsoft/WSL#12444](https://github.com/microsoft/WSL/issues/12444), [microsoft/WSL#11252](https://github.com/microsoft/WSL/issues/11252)）\n\n```\n使い方: recycle [オプション] \u003cパス\u003e...\n\n指定したファイルとディレクトリをごみ箱に移動する。\n\nデフォルトの動作（--rmなし）は、ユーザーがエクスプローラーでファイルを削除した場合と同じ\nように、シェルの普通の進捗や確認ダイアログを表示して、エクスプローラーの元に戻す履歴に追加\nすることです。これはWindows APIの制限による：ダイアログなしでごみ箱に移動することは\nシェルが永久に削除してしまうリスクが伴うので不可能です。ゆえに、スクリプトではユーザーが\n期待していない時にこのコマンドを--rmなしで使用してはならない。\n\n引数:\n  \u003cパス\u003e...\n          カレントディレクトリからの相対、ごみ箱に移動するファイルやディレクトリ。\n          Linuxパスは自動的にWindowsパスに変換される。\n\nオプション:\n  -f, --force\n          存在しないファイルを無視して\n      --rm\n          すべてのダイアログを非表示にして、シェルがごみ箱に移動できないものを永久に削除\n          させる。--recursiveを指定しないと、ディレクトリはエラーを引き起こす。\n          WSLファイルシステム上のファイルはLinux側で削除される（Linux側のごみ箱を使用\n          していない限り）。\n\n          警告：ごみ箱に移動できたはずのファイルが削除される可能性がある。\n          詳細はrecycle_bin.rsのコメントを参照してください。\n  -r, --recursive\n          --rmが使用される場合、ディレクトリのごみ箱への移動と削除を許可する。--rmなしで\n          効果がない（代わりにシェルがダイアログを表示する）。\n  -v, --verbose\n          削除進捗をターミナルで表示する\n      --use-linux-trash\n          WSLファイルシステム上のファイルをごみ箱に移動している時にFreedesktop.org\n          のごみ箱を使用する。\n      --no-use-linux-trash\n          WSLファイルシステム上のファイルを永久に削除する（--rmではない場合、ダイアログ\n          を表示）\n  -h, --help\n          ヘルプを表示する\n  -V, --version\n          バーション情報を表示する\n```\n\n## open\n\n[ShellExecuteExW](https://learn.microsoft.com/ja-jp/windows/win32/api/shellapi/nf-shellapi-shellexecuteexw)の簡単なラッパーです。\n\n\u003e [!IMPORTANT]\n\u003e .bashrcとかに`export BROWSER='open'`に追加してください。\n\u003e \n\u003e UbuntuとDebianでは[alternativesシステム](https://manpages.debian.org/wheezy/dpkg/update-alternatives.8.ja.html)が/usr/bin/openやデフォルトのブラウザでリンクを開くために使われる2つのコマンドのシンボリックリンクを管理しているかもしれません。そのリンクが代わりにwsl-toolsに指すようにできます：\n\u003e ```bash\n\u003e for cmd in open www-browser x-www-browser; do\n\u003e   sudo update-alternatives --install \"/usr/bin/$cmd\" \"$cmd\" '/mnt/c/Program Files/wsl-tools/open' 999\n\u003e done\n\u003e ```\n\n\u003e [!TIP]\n\u003e `open -e image.png`は、image.pngを右クリックして「編集」を選択するのと同じです。デフォルトではペイントで開くんですが、Winaero Tweakerを使うか、regeditでこのキーを変更することで、好みの画像編集ソフトに設定できます： `HKEY_CLASSES_ROOT\\SystemFileAssociations\\image\\shell\\edit\\command`\n\n```\n使い方: open [オプション] \u003cパス\u003e...\n\n指定されたファイルまたはURLをデフォルトのプログラムで開きます（ディレクトリは\nエクスプローラーで開きます）。\n\n--verbに関する詳細は、次を参照してください：\nhttps://learn.microsoft.com/ja-jp/windows/win32/shell/launch#object-verbs\n\n引数:\n  \u003cパス\u003e...  開くファイル、ディレクトリ、および/またはURL。Linuxパスは自動的に\n             Windowsパスに変換される。\n\nオプション:\n  -e, --edit         --verb editのエイリアス\n      --runas        --verb runasのエイリアス\n      --verb \u003cVERB\u003e  実行すべき動詞\n  -h, --help         ヘルプを表示する\n  -V, --version      バーション情報を表示する\n```\n\n## 法的事項\n\nCopyright © 鏡音マックス  \n[Apache License 2.0](LICENSE.txt)の下でライセンスされています\n\n## 違法事項\n\n[海賊！](https://www.youtube.com/watch?v=NSZhIAfR6dA)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxkagamine%2Fwsl-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxkagamine%2Fwsl-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxkagamine%2Fwsl-tools/lists"}