Everything - Windowsのつよつよファイル検索ソフト

# Everythingとは

[voidtools](https://www.voidtools.com/)が出している、Windows向けのファイル検索ソフト。(かなりつよつよなexplorer)
Changes.txtを見ると2004年からあったらしい。

ディレクトリによる階層構造は、分類分けと整理をうまくデザインすることで検索性を高めるが、
フォルダ自体が四散していたり、整理されている場所が複数になったりすると、検索性が悪化する。
フォルダ自体を四散しなければよいという発想は、たぶん無理。(エントロピーの法則とか全然しらんけどそのへんの話)

であるから、ファイルは散在している前提で検索できなければ困るのである。
しかし、Windowsのファイル検索は使いにくい！[^1]

[^1]: インデックスがはられるDesktop直下とかDocuments直下とかStart Menu内部の検索はそこそこ速く、使い勝手も良い。Windowsキー→文字入力でアクセスできる。自分は多用している。

僕はPCのOSはWindows以外はぜんっぜん触らないのでLinuxがとかMacがとかの話はできないけど、Windowsのファイル検索がクソ不親切なのは間違いない。
マウスでポチポチが苦痛じゃなければできるんだろうけど。
ファイル検索をGUIでやるのは限界があるんじゃ。

ってんで
* 部分一致のAND検索が文字列でかんたんにできる
* すべてのファイルの中から検索した結果を軽快操作で検索できる
* 検索結果のファイル・フォルダに対する処理がらくらく
なEverythingを紹介するゾ


## 何ができるのさ

* 検索・並び替え
  * フィルター形式/正規表現で(検索)
  * ファイル名やフルパスで(並び替え)
  * Attributeで(Directory/Readonly/ほか)
  * 日付で(指定でも範囲でも)
  * Sizeで
     * なによりこれらでの検索を「**高速に**」「**比較的かんたんな文字列で**」行える。
     * or 条件もあるので、複数のフォルダにまたがって検索できる。
* ファイル検索に関する整理ができる。
  * よく使う検索条件を登録しておいてかんたんに呼べるフィルター
     * `pic:`で画像(の拡張子のファイル)だけ検索など。左記ほか一部は登録済みでインストールされる。
  * 検索条件を名前付きで保存するBookmark
* 検索したファイルはそのまま実体なのでexplorerと変わらず・explorer以上の操作ができる。
  * そのままファイルを開く・実行する
  * 右クリックメニューがそのまま使える
  * コピー・切り取り・ショートカット作成・リネーム
     * リネームは複数ファイルを対象に一括で行える。(フォルダ跨いで可能)
     * フォルダ階層を維持したり組み替えたりフォルダ名変えたりしながらコピー・移動

## どのへんが欠点さ

* 検索仕様がチョット難しい
  * 多少オリジナルな仕様で覚えゲー。(GoogleのAdvanced Search程度のレベル感。)
     * 検索仕様はヘルプですぐ引ける
* ネットワークドライブの検索にはラグがある
* 細かな初期設定他チューニングがチョット難しい
  * 本記事で筆者の設定例とかを共有するゾ。
* インデックスの作成時は少し時間を食う
  * [FAQ](https://www.voidtools.com/faq/#how_long_will_it_take_to_index_my_files)にある通り、Windowsだけインストールされた環境(約12万ファイル)でインデックスの作成に**1秒も**かかってしまう。
     * **100万ファイルあると1分も掛かる。**いやーながいなー、カップ麺のお湯が湧いちゃうなー(棒)
* インデックスの作成時にメモリをそこそこ食う
  * ファイル数にもよるが、監視している対象が激しく更新されるとか、起動直後は激しくメモリを消費する。(真顔)
* 検索後のファイル操作で、フォルダを跨いで大量のファイルを処理すると流石に重くなる。
  * あんまりたくさんのファイルを一度に処理しようとすると、Everythingがプチフリやガチフリーズする。BotDとかになるほどではない。
* システムファイルとかをも容赦なく検索できてしまう。
  * システムファイルだと気づかずに操作してるとOSぶっ壊wawawawawawawa
  * 設定で除外できる。
* 空フォルダの削除に使うと痛い目を見る場合がある。(除外設定をミスっている場合)
  * 空フォルダの削除はバッチを使った方法が安全なのでこれを推奨(`dir`の出力を逆さ順にして`rd`流すやつ。[これ](https://rms-099.hatenablog.jp/entry/20130121/1359223420))
     * `for /f "delims=" %d in ('dir . /ad /b /s ^| sort /r') do rd "%d"`


# インストール

1. [トップページ](https://www.voidtools.com/)から該当を選ぶ。
   * 公式がPortable版も配っている。ありがてえ...(管理者権限がないとちょっとキツいが。)
2. インストーラ実行する
    1. インストール先選ぶ
    1. 設定・データ(DB)の設置場所選ぶ
    1. NTFS indexing は、NTFSドライブのファイルインデックスを作成する方法。
        * 管理者権限があるなら「Everythingサービスをインストール(デフォルト)」が推奨
        * 「管理者として実行」は、PC起動毎にEverythingが管理者権限を要求してきてまあまあうざい。
    1. その他オブションを指定する。
        * 「フォルダコンテキストメニューにインストール」が便利なのでチェック推奨
            * (フォルダの右クリックメニューから、そのフォルダ配下のファイルで検索を開始できる)
3. 初回起動時は検索データベースを作成する処理が走るのでしばし待って...利用開始だ

## Portable版を利用する場合
exeを叩くと初回起動時(EXEとlang以外無い場合)にNTFSボリュームのインデックス作成方法を聞かれる。
「Everythingサービスをインストール」が推奨だが、もしアプリ本体をUSBに入れて持ち運んでいろんなコンピュータで使う想定なら、どうせ管理者権限を要求されるので「管理者として実行」でよい。

起動後NTFSボリュームが自動で読み込まれる。

# How to Use
とりあえず検索してみよう。
`仕様書 *.xlsx`
のように検索すれば、「仕様書」がファイル名・フォルダ名に含まれ、`.xlsx`で終わるファイルが検索される。
拡張子の指定であれば、`ext:xlsx`のような指定も可能だ。
`ext:xlsx;xlsm;xls`のように複数指定することもできる。

検索したい文字列と一致するdllがいっぱいあってうざい！とかなら
NOT演算子(!) を併用して`!ext:dll`とすることで除外設定もできる。

半角スペースは AND演算子 として解釈される。
Windowsのファイル指定と同様、検索文字列として半角スペースを使いたい場合は`"C:\Program Files\"`のようにダブルクォーテーションで囲う。
`C:\Program Files`だと、設定にもよるが、 `C:\Program`と`Files`をフルパスに含むファイルの一覧が検索される。
あと、`"C:\Program Files"`とすると、「**C:\Program Files** (x86)\...」となるファイル・フォルダも検索される。

## 検索する

### 検索仕様早見
メニューバーの`ヘルプ>検索仕様` に全部乗っている。
私がよく使うのは下記

```:検索仕様
修飾語:
	file:	ファイルのみにマッチを有効にします。
	folder:	フォルダのみにマッチします。
	regex:	正規表現を有効にします。

機能:
	attrib:<属性>	指定した属性をもつファイル・フォルダのみを検索対象にします。
	dc:<日付>	指定した作成日時のファイル・フォルダのみを検索対象にします。
	dm:<日付>	指定した更新日時のファイル・フォルダのみを検索対象にします。
	dupe:	重複したファイル名（ダブリ）のみを検索対象にします。
	empty:	空のフォルダのみを検索対象にします。
	ext:<拡張子>	検索対象となる拡張子を絞ります。ｾﾐｺﾛﾝ(;)で区切り複数指定することができます。
	size:<サイズ>	指定したサイズ(size)のファイル・フォルダのみを検索対象にします。
```

* `regex:`は`regex:filename$`のように、`:`に続けて文字列を記載する。半角スペースを含む場合→`regex:"str with space"`
  * `ヘルプ>正規位表現の仕様`にもヘルプがある(未翻訳)が、ここに記載のない表記(単語構成文字`\w`とか)も使える。
* `<|強調したい文字列>`のように、空文字列をOR演算子で結合すると、Filterしないけど強調だけすることもできる。(オプションの「全般>表示>一致箇所を強調する」が有効の場合)

### フィルタ
メニューバーの`検索`の「フィルタに追加」から下はすべてフィルタに関するアイテム

`フィルタ編集`から、「圧縮ファイル」を例に内容を説明する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226001/7d59e480-6ac0-3c58-656a-05da3f1868f1.png)

* 上半分はメニューバーの`検索`で指定できる条件。
* 「検索」には、そのフィルタを指定したときに前提として適用される条件を指定する。
  * 「圧縮ファイル」では、「圧縮ファイルに使われる主要な拡張子のファイル」が指定されていることがわかる。
  * フィルタとして「圧縮ファイル」を選択すると、上記の条件に当てはまるファイル・フォルダの中から検索が実行される。
  * 検索文字欄になにか入力すると、その条件と「圧縮ファイルっぽい拡張子のファイル」の中から検索される。
  * メニューバーの「検索」で指定するほか、「表示」で「フィルター欄を表示」すると、検索文字欄右にフィルタのコンボボックスが追加される。  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226001/c1b849bd-db0c-4767-5e00-7929bcde8a69.png)
* 「マクロ」では、検索文字欄からフィルタを呼び出すための文字列を指定する。
  * 「圧縮ファイル」では、「`zip`」となっている。
  * フィルタを選択せずに、検索文字欄に「`zip: c:\workfolder\`」と指定するのと、フィルタで「圧縮ファイル」を選択して「`c:\workfolder\`」と指定するのは同じ
  * マクロを利用することで、フィルタを併用することができる。

私は、`ext:xla;xlam;xls;xlsb;xlsm;xlsx;xltm;xltx`を、マクロ名「`excel`」として登録している。
エクセルドキュメントまみれだし`xls`と`xlsx`と`xlsm`が混在しているのでまあまあ重宝する。(左記だけなら`regex:\.xls[xm]?$`でこと足りるが)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226001/5334d37b-f277-d8e2-54f2-057992c83278.png)


### 表示
メニューバーの「表示」で、検索結果の表示方法を細かく指定できる。

* プレビュー枠
  * explorerよろしくファイル内容を表示する。
  * 画像とかだけでなくexcelなんかも開いてくれる。
  * Everythingがというよりファイルのほうが重てえことが多いので僕はオフ
* テキストサイズ
  * 全体的な表示に影響がある。パス名なんかが長いからちょっと小さくても見やすくしたい！とかで調整したりする場合に利用
  * デフォルトのフォントサイズは設定の「`全般>フォントと色`」の「サイズ」で指定できる。

### ブックマーク
ここまでで記載してきた「検索条件・フィルタ・表示」に加え、「検索データの指定」を含めた状態を保存しておく機能
並べ替えだのアイコン表示だのも制御できる。
フィルタと同様マクロを設定できる。

## 検索後のファイル操作

### 右クリックメニューなどからできる操作(Explorerでもできるレベルの動作)
* ダブルクリックなど選択動作で通常のExplorerと同様に「開く」
* 親フォルダをexplorerで開く
* フルパスのコピー
* その他標準のExplorerの右クリックメニューでできるリネームなど

### Explorerでは痒かった操作
#### 一括リネーム
* 対象のファイルを複数選択して「右クリックメニュー>名前の変更」かショートカットキー`F2`(Explorerもリネームは`F2`)
    * 格納されているフォルダを変えたい場合はすぐ下の「一括コピー/移動」の操作
* 「リネーム」ウィンドウが表示される。
    * 「元のファイル名」から`%1`などにキャプチャ(変数として保持)して、「新ファイル名の書式」で再利用できる。
        * 「元のファイル名」に`%1.%2`として「新ファイル名の書式」に`%1.txt`とすれば、拡張子がすべてtxtになる。
    * `%1`などが「キャプチャ」される範囲になり、置換後の文字列でも利用できる。
    * 「正規表現」にチェックをつければ正規表現の置換に近い操作にできる。
    * 下のほうに出る「新しいファイル名」がプレビューになっている。
        * 実行前におなじフルパスのファイルがないか確認したほうがよい。

#### 一括コピー/移動
* コピーまたは移動したいファイルを検索結果内で選択したあと、メニューバーの「編集>高度コピー・移動メニュー」から起動する。
    * フォルダの移動を伴わない場合はすぐ上の「一括リネーム」のほうがかんたん(こっちでもできるが)
* 操作は「一括リネーム」のウィンドウとほぼ同じなので真上を参照のこと。
    * 違いは、「リネーム」はファイル名だけを制御する(フォルダは変えられない)が、こちらは格納されるフォルダなども細かく制御できる。
        * 存在しないディレクトリ階層を指定するとフォルダ階層を作りながらコピーしてくれる。つおい。

## ファイルリストの出力
Everythingで検索した状態でメニューバーの「ファイル>エクスポート」を行うと、
現在の検索結果に表示されているファイル・フォルダの一覧をファイル出力できる。

文字エンコードはUTF-8で出力されるため、Excelなんかでひらく場合はShiftJISで保存しなおしてからでないと文字化けする。

### CSV
Everythingの出力時点の画面表示に近い出力を得る。
列の指定、列の位置もエクスポート時のそれになるので、レイアウトの変更が可能。
(逆に言えば、列の位置や表示を変えるとレイアウトが変わってしまう。)

後述する`EFU Everything ファイルリスト`と違い、更新日時などの時刻情報や、属性の表現が、人間が読み取れるような表現となっている。
このため、エクセルなどで手作業で情報整理するのに向く。

### EFU Everything ファイルリスト
Everything独自フォーマットのCSVのようなもの。
属性はバイナリのフラグ値を10進数に変換した値だし、日次はなんかのシリアライズ値だしで、ファイル名とサイズくらしか読めぬ。

Everythingで処理することのみに特化した形式。
[ファイルリスト(.efu)・ファイルリストエディタ]に詳述。

#### 追記
日付の書式とかの情報ちゃぁんと乗ってた


> [What is the format of an EFU file list? - voidtools](https://www.voidtools.com/support/everything/file_lists/#what_is_the_format_of_an_efu_file_list)
EFU files are comma-separated values (CSV) files.
A header is required to define the columns in the file list.
The Filename column is required.
The Size, Date Modified, Date Created and Attributes columns are optional.
File size is specified in bytes.
Dates are FILETIMEs (100-nanosecond intervals since January 1, 1601.) in decimal or ISO 8601 dates.
Attributes can be zero or more of the Windows File Attributes in decimal (or hexidecimal with 0x prefix).
EFU files are encoded with UTF-8.

`The Size, Date Modified, Date Created and Attributes columns are optional.` とあるので、そもそもこのへんは省略が可能。

Dateの形式は、ファイルリストエディタを使用すると「`FILETIMEs (100-nanosecond intervals since January 1, 1601.) in decimal`」で出力されていて、`ISO 8601 dates`形式での入力に対応している。

例えば`2022-05-31T15:09:45`を指定できる。

あと、出力された日付は次の式でエクセル日付データにできる
```vb
=入力/10000000/60/60/24-("2200/1/1"-"1901/1/1"-3-(9/24))
```

以下式解説
```vb
=入力
    /10000000 ' /100 nano → /1
    /60/60/24 ' /1s → /1day (Excelの+1量)
    -(
        "2200/1/1"-"1901/1/1" -3 
            ' 1900/1/1(Excel日付データの1) - 1601/1/1(FILETIMEsの0) を疑似的に算出。
            ' -3はうるう年分の調整だと思う(ずれたから直した)
        -(9/24) ' 標準時分のズレ9時間
    )
```

尚、エクセルに貼り付けした時点でケタ溢れするので、100ミリ秒以下(多分)の誤差が出る。(ほぼ誰も困らない)

### テキストファイル
検索結果にあるファイルのフルパスの一覧が作成される。
検索結果に対して複数選択して、コンテキストメニューから「フルパスをクリップボードにコピー」することでも可能だが、ファイルの数が増えるとコンテキストメニューを開く動作が重くなるので、こっちを使ったほうがよい。

# 推奨設定
いっぱい書きすぎたので推奨したい設定だけ書いていく。
ばりばりの個人的好み

個別記事にしたのでそちらを見てください。

https://qiita.com/UFOnian/items/f31267b7c25eeca8c853

最低限しておくとよい設定だけここに記載します。

## 全般
* [x] コンテキストメニューに追加する
  * フォルダのコンテキストメニューに`Search Everything...`が追加される。
  * 選択すると、そのフォルダ配下(子孫)を検索する文字列が入力された状態でEverythingが起動する。(`"C:\Users\example\Desktop\" `など)

### インターフェイス
* [x] 行のどこでもクリックしても選択可能にする

### 新規ウィンドウ時(Home)
Everythingの新規ウィンドウ表示時の指定をする。

:::note warn
気まぐれで設定変えた次の検索で初期設定されておいてほしい設定にすると良い。
つまり、**デフォルト値の「最後の値」にはしない**ことが推奨。

前回の検索で変な設定にしたときに「あれ、なんでこんな検索挙動なんだ？」となる。
全て設定しておこう。
:::

### コンテキストメニュー

* [x] フルパスをクリップボードにコピー

# Tips

## ファイルリスト(.efu)・ファイルリストエディタ
UTF-8でエンコードされたCSV(`Filename,Size,Date Modified,Date Created,Attributes`)

```csvs:コピー用
Filename,Size,Date Modified,Date Created,Attributes
```


[ファイルリストの出力]によって得るほか、
メニューバーの「ツール>ファイルリストエディタ」に、Everythingやほかのファイルブラウザからファイル・フォルダをドロップすることでリストを作成し、保存することで生成される。

:::note info
ファイルリストエディタはあくまで「リスト」を編集する機能なので、ファイル実態がどうだとかは基本的に感知しない。
また、ファイルリストの内容は直接テキスト編集することで「でっちあげ」可能。(存在しないファイルをあるかのように記載できる)
:::

以下個人的に把握している仕様(もちヘルプに詳細情報のってると思う)

* UTF-8でエンコードされたCSV(`Filename,Size,Date Modified,Date Created,Attributes`)
* ファイルリスト上のファイルが、そのPC上で参照できる範囲に存在していなくとも検索できる。
* 作成したファイルリストは、Everythingの検索で利用することができる。
  * 下記のような芸当が可能
     * PC1でEverythingからファイル一覧を出力しておいてPC2での検索に含める
     * バージョン管理に保存しているが作業コピーを作成していないファイル群を、ファイルリストにエクスポートしておいて検索に含める
     * ドライブレターに本来利用できない文字を指定できる(`$:\VSSProject`のように)

VCSで管理しているファイル一覧を、Everythingファイルリストとして使用できる形式で出力するバッチとか作ったりしている。[^2]
もち、「CLIで検索できるが？」っていうつよつよな人にはいらないだろうけど。

[^2]: そもそもファイル検索ソフトが必要なくらい階層の深いRepositoryを作るなという話にはなりそうだが。


## シンボリックリンクのリンク元内にファイルがあるかのように検索する

下記リンクの解説を参考に設定変更したり、iniファイルをいじいじすることで、シンボリックリンク内も検索できるようになる。
[Everything doesn't work with directory symbolic link](https://www.voidtools.com/forum/viewtopic.php?t=9720)

「difficult, but fast」とある方法も頑張れば設定できた。頑張れ。
(SymLinkいじいじするような人ならできるでしょ)
(まあまあめんどくせーのでそうそう変えないやつだけ設定してる。)

## コマンドラインからの起動
詳細は「ヘルプ>コマンドラインオプション」を確認のこと。
検索文字列とかフィルターとか指定して起動するとかできる。



<!-- 
## 何ができるのさ(下書き)

* 検索・並び替え
  * フィルター形式/正規表現で検索
  * ファイル名やフルパスで並び替え
  * Attributeで(Directory/Readonly/ほか)検索・並び替え
  * 日付で(指定でも範囲でも)検索・並び替え
  * Sizeで検索・並び替え
  * なによりこれらでの検索を「**高速に**」「**比較的かんたんな文字列で**」行える。
  * or 条件もあるので、複数のフォルダにまたがって検索できる。(というか、パス指定しなければ全ファイル検索する)
* ファイル検索に関する整理ができる。
  * 検索条件を名前付きで保存するBookmark
  * よく使う検索条件を filterとして登録して命名しておけばかんたんに呼べる。
    * `pic:`で画像(の拡張子のファイル)だけ検索など。左記ほか一部は登録済みでインストールされる。
* 検索したファイルはそのまま実体なのでexplorerと変わらず・explorer以上の操作ができる。
  * そのままファイルを開く・実行する
  * 右クリックメニューがそのまま使える
  * コピー・切り取り・ショートカット作成・リネーム
    * リネームは複数ファイルを対象に一括で行える。(もちフォルダ跨いで可能)
    * フォルダ階層を維持したり組み替えたりフォルダ名変えたりしながらコピー・移動

## どのへんが欠点さ(下書き)
* 検索仕様がチョット難しい
  * 本当にチョットという言葉が意味する通り、別にものっそい難しいわけではない。GoogleのAdvanced Search程度の難易度
  * 多少オリジナルな仕様なので覚えゲーではある。(GoogleのAdvanced Searchと同じように。)
* ネットワークドライブの検索にはラグがある
* 細かなチューニングがチョット難しい
  * いくつかの上級機能は、活用するのに多少知恵を使う。
  * 本記事で筆者の設定例とかを共有するゾ。
* インデックスの作成時は少し時間を食う
  * [FAQ](https://www.voidtools.com/faq/#how_long_will_it_take_to_index_my_files)にある通り、Windowsだけインストールされた環境(約12万ファイル)でインデックスの作成に**1秒も**かかってしまう。
    * **100万ファイルあると1分も掛かる。**いやーながいなー、カップ麺のお湯が湧いちゃうなー。
    * かなり快適。
* インデックスの作成時にメモリをそこそこ食う
  * ファイル数にもよるが、監視している対象が激しく更新されるとか、起動直後は激しくメモリを消費する。(真顔)
* 検索後のファイル操作で、フォルダを跨いで大量のファイルを処理すると流石に重くなる。
  * あんまりたくさんのファイルを一度に処理しようとすると、Everythingがプチフリやガチフリーズする。
    * BotDとかになるほどではない。
* システムファイルとかをも容赦なく検索してしまう。
  * システムファイルだと気づかずに操作してるとOSぶっ壊したりしてまあまあ危険。
    * 除外対象設定である程度回避できる。
* 空フォルダの削除に使うと痛い目を見る場合がある。
  * というか見た。`.git/`の除外設定でミスって、`.git`フォルダが`size:0`として検索される。空のフォルダをまとめて消してたら、履歴消し飛んだ。(バックアップあってよかった)
    * `Git`をファイルバックアップの意味も含めて運用していた僕が100悪い。Gitをバックアップとして使うなって誰かが言ってた。
    * `*\.git\**`の除外設定で、`.gitフォルダの子ファイルは無視せず、孫ファイルは無視`の動作になっているのでこれを除外している。
  * 空フォルダの削除はバッチを使った方法が安全なのでこれを推奨(`dir`の出力を逆さ順にして`rd`流すやつ。[これ](url貼る))

-->