メインコンテンツまでスキップ

zoxideのデータベースを整理する

· 約4分
mebiusbox
enginner

zoxideのデータベースを参照してスコアの低いエントリを削除するpowershellスクリプトの紹介です.

zoxideはターミナルで使うcdコマンドの改良版です.cdコマンドで移動したディレクトリを履歴としてデータベースに保存し、あとは履歴を参照して移動したことがある場所に行き来するときに便利です.その際に、短い名前で履歴から一致した場所に移動できるので、よくディレクトリを切り替えたりするときに便利です.

履歴はzoxideのデータベースに格納されます.私の環境(Windows11)では以下の場所にありました.

C:\Users\<username>\AppData\Local\zoxide\db.zo

このファイルを削除すれば、データベースは初期化されます. しかし、データベースの初期化ではなく、低いスコアのエントリを削除するためにpowershellスクリプトを作成しました. これは、スコアが特定の値以下であるものを削除します.また、ついでに存在しないディレクトリであれば、それも削除します. 一応、zoxideは一定期間(90日)で似たようなことをしてくれるようです.

エントリの閲覧

データベースの内容を確認するにはzoxide queryコマンドを使います.

zoxide query [OPTIONS] [KEYWORDS]...

現在、有効なエントリを見るには --list または -l を指定します.

zoxide query --list

無効なディレクトリも確認したい場合は、--all または -a を合わせて使います.

zoxide query --list --all

また、スコアも表示したい場合は --score または -s を指定します.

zoxide query --list --score
zoxide query --list --all --score
zoxide query -las

powershellスクリプト

本題のスクリプトです.やっていることはエントリをスコア付きでリストアップし、各エントリごとにディレクトリの存在チェック、そしてスコアをチェックして、削除対象であれば、エントリをデータベースから削除します.削除するにはzoxide removeコマンドを使います.

function Prune-ZoxideDB([double]$threshold=1.0) {
[Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
Write-Host ("Score threshold = {0}" -f $threshold)
$total = 0
$count = 0
zoxide query --list --all --score | ForEach-Object {
$total++
if ($_ -match '([0-9]+\.[0-9]+)\s+(.+)') {
$score = [double]$Matches.1
$path = $Matches.2
if (-Not(Test-Path -LiteralPath $path)) {
zoxide remove $path
Write-Host ("Not Exist (removed). [{0}]" -f $path)
$count++
}
elseif ($score -lt $threshold) {
zoxide remove $path
Write-Host ("{0}, {1} (removed)" -f $score, $path)
$count++
}
}
}
Write-Host ("total={0} removed={1}" -f $total, $count)
}
  • 標準でスコアは 1.0 未満を削除するようにしています.
  • コンソールに詳細(日本語含む)を出力するためにUTF8エンコーディングに変更しています.

次のように使います.

Prune-ZoxideDB
Prune-ZoxideDB 0.8

以上です.

注記

PowerShellのcdコマンド(Set-Location)では名前の先頭に[]があると、ディレクトリ名として正しく認識できません.その場合、-LiteralPath を指定する必要があります.

例えば、次のように標準の cd エイリアスを無効にして、新しいcd関数を定義することができます.

if (Test-Path alias:cd) {
Remove-Alias cd
}
function cd ([string]$Path) {
Set-Location -LiteralPath $Path
}

powershellのエイリアスはパラメータを指定することが出来ないため、関数として定義します.この方法でも zoxide は有効になります.