🗃️

大学生、ファイルの管理方法を考える

に公開

もともと『大学生、Windowsにおける快適な操作環境を思案』という記事に全文載せるつもりでしたが、文量が果てしなく長くなることになるので別記事に分けました。

導入

Windowsを使っている時にこんな問題に遭遇したことはありませんか?
「あれー?使おうと思っていたファイルはどこに置いたかな?」
ネットからダウンロードしたファイルを一週間後に使おうとしたら置いた場所を忘れてしまった、編集していたファイルをどこかに置いてしまった・・・などなど、ファイルが行方不明になること、ありませんか?
そんなこんなでファイルの管理方法を調べても、どれも同じような量産記事がヒットします。たまーに分かりやすい記事がありますが、それでも数が少ない。
ということで、実際に私が行っているファイル管理方法の紹介もかねてファイルの管理方法を考えましょう。

ディレクトリツリーの作成はこちらのツールを使います。
https://zenn.dev/praha/articles/b2e225ae091ae3

対象

  • ファイルの管理方法を模索している人

フォルダーの問題

ファイルを管理する上で問題になってくる、それがフォルダーの階層問題。ここではそれらの問題について考えましょう。
こちらが整理するファイルです。

(Unity) 2D_shooting
(Unreal Engine) 2D_shooting
(Unreal Engine) 2D_shooting.exe
(Unreal Engine) 3D_shooting
(Godot) 2D_shooting
(Godot) 2D_action.exe
(Godot) 2D_action
(Python) FizzBuzz.py
(Python) CaesarCipher.py
(D) FizzBuzz.d
(D) CaesarCipher.d

フォルダーの名前問題

https://x.com/karaage_rutsubo/status/1219729253450698753
例えばあなたはデスクトップにフォルダーを作りました。Windowsだと『新しいフォルダー』で作成されますね。
さて、このまま運用しますか?
もしあなたがパソコンについて詳しくない上司だった場合、作った名前そのままにして、『新しいフォルダー (2)』、『新しいフォルダー (3)』、『新しいフォルダー改』、『新しいフォルダー_2024年9月13日』、『新しいフォルダー_最終』とセンスのない名前をつけてデスクトップを散らしていく姿が目に浮かぶでしょう。そして、作ったフォルダーの中にまた新しいフォルダーを作成・・・。
もちろん、それで管理できているのであればそのままでいいです。この記事を読む必要はないでしょう。しかし、大抵の人は凡人です。たった一分前の行動ですら忘れ、何を検索しようとしたかも忘れてしまうような、そんな凡人です。
https://x.com/yaneuraoh/status/1424625886112796673
昔から人は何も変わらないのです。古いものに『新』とつけてバージョンアップと叫ぶ、そういうものなのです。

これでは、いけませんね。

ということで混乱を防ぐためにフォルダーの名前を統一しましょう。
例えば―――実行ファイルに対応するようにフォルダーの名前を変えてみましょう。

Unity
└─ (Unity) 2D_shooting
Unreal Engine
├─ (Unreal Engine) 2D_shooting
├─ (Unreal Engine) 2D_shooting.exe
└─ (Unreal Engine) 3D_shooting
Godot
├─ (Godot) 2D_shooting
├─ (Godot) 2D_action.exe
└─ (Godot) 2D_action
Python
├─ (Python) FizzBuzz.py
└─ (Python) CaesarCipher.py
D
├─ (D) FizzBuzz.d
└─ (D) CaesarCipher.d

もちろんこのままでもいいですが、ドキュメントフォルダーに自動的に作成するソフトを使ったときや名前が似ているが目的別のファイルがあったとき、探すのに手間がかかる場合があります。
そのため、タグ付けのように特定の単語を決めておくことで回避することを意識しましょう。個人によっていろいろな名付け方がありますが、ここでは一例として私が決めている形を使います。

  • Projects
    ソフトウェアを介して作成したファイルを入れる。UnityやGodotなどで作成される編集ファイルを指す。作成されたフォルダーもここに入る。
  • Program
    PythonやC言語などで作成されたコードを入れる。この階層からさらに細分化していく。
  • Creats
    作成したファイルを入れる。UnityやGodotでコンパイルした実行ファイルがここに入る。

このように何をしているのかを指す単語を使うようにします。この名付けはドキュメントに自動的に作成されるフォルダーの回避にもつながります。

Visual Studio 2022
Projects_Visual Studio 2022

上が自動的に作成されたフォルダーです。中にはCode SnippetsとTemplatesのフォルダーがあります。一方、下のフォルダーはProjectsという形で作成したため、編集ファイルを中心としたプロジェクトファイルが入っていることが分かります。
ドキュメントに作成されるフォルダーは大抵設定ファイルが入っていることが多く、なにかの拍子で削除した場合今まで設定した内容がすべてなくなる可能性があります。しかし、フォルダーを分けることで綺麗に分けることができるようになります。

さて、そうするとこのように分けることができませんか。

Projects
├─ (Unity) 2D_shooting
├─ (Unreal Engine) 2D_shooting
├─ (Unreal Engine) 3D_shooting
├─ (Godot) 2D_shooting
└─ (Godot) 2D_action
Creat
├─ (Unreal Engine) 2D_shooting.exe
└─ (Godot) 2D_action.exe
Program
├─ (Python) FizzBuzz.py
├─ (Python) CaesarCipher.py
├─ (D) FizzBuzz.d
└─ (D) CaesarCipher.d

このままでもいいですがもう少し使いやすくしてみましょう。ためしに三つの例を挙げます。

1
Creat_Game
├─ (Unreal Engine) 2D_shooting.exe
└─ (Godot) 2D_action.exe
Projects_Unity
└─ (Unity) 2D_shooting
Projects_Unreal Engine
├─ (Unreal Engine) 2D_shooting
└─ (Unreal Engine) 3D_shooting
Projects_Godot
├─ (Godot) 2D_shooting
└─ (Godot) 2D_action
Program_Python
├─ (Python) FizzBuzz.py
└─ (Python) CaesarCipher.py
Program_D
├─ (D) FizzBuzz.d
└─ (D) CaesarCipher.d
2
Creat_Game
├─ (Unreal Engine) 2D_shooting.exe
└─ (Godot) 2D_action.exe
Unity_Projects
└─ (Unity) 2D_shooting
Unreal Engine_Projects
├─ (Unreal Engine) 2D_shooting
└─ (Unreal Engine) 3D_shooting
Godot_Projects
├─ (Godot) 2D_shooting
└─ (Godot) 2D_action
Python_Program
├─ (Python) FizzBuzz.py
└─ (Python) CaesarCipher.py
D_Program
├─ (D) FizzBuzz.d
└─ (D) CaesarCipher.d
3
Creat
├─ Unreal Engine
│  └─ (Unreal Engine) 2D_shooting.exe
└─ Godot
   └─ (Godot) 2D_action.exe
Projects
├─ Unity
│  └─ (Unity) 2D_shooting
├─ Unreal Engine
│  ├─ (Unreal Engine) 2D_shooting
│  └─ (Unreal Engine) 3D_shooting
└─ Godot
   ├─ (Godot) 2D_shooting
   └─ (Godot) 2D_action
Program
├─ Python
│  ├─ (Python) FizzBuzz.py
│  └─ (Python) CaesarCipher.py
└─ D
   ├─ (D) FizzBuzz.d
   └─ (D) CaesarCipher.d

このような感じでファイルを分けることができます。壁紙だったらWallpaper、ゲームだったらGameと設定できますね。
決めた名称の前か後に名前を付けるのか、決めた名称の下に階層を置くのか、いろいろな考え方があります。いずれもパッと見て、どこに対象となるソフトウェアのファイルがあるのかが分かりやすくなります。また、実行ファイルと規格化した名称をうまい具合に繋げることで、目的のファイルに辿りやすくなります。
この分け方は一例ですので、自分にあったやり方を見つけていきましょう。
ということでこの段落では、名称の規格化を行って、どのようなファイルが入っているかを判別できるようにするという考えを述べました。

該当しないファイルがあった場合

もし上のように作成した名前に該当しないファイルが出てきた場合、どのように整理するといいのか。
名称の規格を決めるほうが効率がいい場合は決めてしまいましょう。ただ、一時的にしか使わないファイルや特殊的なファイルならどうしますか?
私はネットからダウンロードしたzipファイルは『ZIP_FILE』に入れ、PDFファイルの取扱説明書は『取扱説明書』に入れています。
例外的なファイルでも「例外」としてタグ付けができるのと同じように、いずれかの分類に分けるという事は可能です。
それでも分けられない場合は―――Anythingとでも名付けて入れましょう⌒ポィー ヽ(´ー` )

フォルダーの階層問題

フォルダーの名前と規格の名前を考えましたら、ファイルを置く階層を作りましょう。
おや、先ほどの名前付けで階層を決めていたのではないかと疑問に思う方もいるでしょう。このように思った方は鋭いです。
実はここの内容はさっきの名付けとあまり差がないのです。では、この章ではなにを考えるのでしょう?
ここでは階層の効率化を考えます。
プログラムでよく言われているのは「階層を深くしすぎないこと」です。察しがいい方は分かりますが、こちらもまた同様に深くなりすぎないことが大切です。
先ほど作ったフォルダーの名前を例題にしましょう。

Unity
Projects_Unity
Unity_Projects
Projects
└─ Unity
Unity
└─ Projects

Projectsをどのように扱うかで、フォルダーの階層がガラッと変わる感じでしょうか。
例えば、ソフトウェアの名前を重視したい場合はUnity/ProjectsUnity_Projectsを採用します。逆にプロジェクトファイルを重視したい場合は、Projects/UnityProjects_Unityを採用します。

ここまでならいいのですが、もし「Unityで使うクリエィティブ・コモンズのフリー素材であるBGMを保存する」という選択肢が生まれたとします。
そうするとこのような構造が思い浮かぶはずです。

Unity
├─ Projects
│  └─ プロジェクト名
└─ Resource
   └─ CC
      └─ BGM
         └─ ファイル名

しかし、これが効率的かと考えると微妙なところです。
Resourceは「再帰性のあるフォルダー」として考えるべきです。そう考えるとこのようにした方がいいかもしれません。

Unity
└─ Projects
   └─ プロジェクト名
Resource
└─ CC
   └─ BGM
      └─ ファイル名

このようにすることで階層のネストを一つ下げることができました。

もし、自ら作成したフォルダー階層が非常に深くネストしている場合、「再帰性のあるフォルダー」だったり「別のフォルダーに移すべきフォルダー」の可能性があります。

プログラマブル的思考

さて、ここまで階層について考えましたが、この構造に見覚えのある人が出てくる段階だと思います。特にプログラムをする方であれば分かるはずです。
そう、これはアプリ開発と似た問題と言えるでしょう。ここまでの考え方は『リーダブルコード』に載っている変数名のつけ方に準ずるものがあります。
例えば指定したファイルを読み込み変換して出力するコードを作りましょう。この時、変数名はどうしますか?
これは一例です。

import std.stdio;
void main()
{
    string filename_input = "savedata_input.txt"
    string filename_output = "savedata_output.txt"
    auto file_input_savedata = File(filename_input,"r");
    auto file_output_savedata = File(filename_output,"w");
}

Pythonのほうがよかったかな、まぁいいか・・・
これは簡単な例ですが、filename_inputfilename_outputという変数を作ってファイルポインタを格納しています。
ここではファイルの名前を重視して作っていますが、入力と出力を重視している場合はinputoutputを先に置くでしょう。

このフォルダーには特定の類いが入っていると分かる設計やこの関数名であればこの動作をすると予測できる設計が、ここ近年ではとても多くなりました。
このように何を重視してどのようなファイルが入っているのかを名前で判別できるようにすると便利になります。つまりは、フォルダーの階層を正規的な考えで管理するとネストを防ぐ要因にもなるというのが、この段落の結論です。

ファイル問題

ファイルの名前問題

さて、階層問題については解決できたとしましょう。ですが、ファイルにつける名前はどうしますか?
https://x.com/karaage_rutsubo/status/1259947364464209928
もしあなたが一般のサラリーマンでその職場には無能な上司がいた場合、このようなファイルの名前を見たことはありませんか?ファイルを何時間もかけて探す行脚の苦行を自ら始めていませんか?
ということでファイルの名前を考えていきましょう。

とはいっても、やることはフォルダーの名付けと同じです。2025年4月1日に作成したテキストファイルを例に出しましょう。

  • 2025年4月1日_〇〇.txt
  • 〇〇_2025年4月1日.txt

おや、同じ日に大きな更新ですね。それではこうしましょう。

  • 2025年4月1日_1_〇〇.txt
  • 2025年4月1日_2_〇〇.txt
  • 〇〇_2025年4月1日_1.txt
  • 〇〇_2025年4月1日_2.txt

どちらがいいのかは個人の判断に任せますが、新や最終といった名付けで子を泣かせるよりかは日付や連番で管理するほうがよほど健全です。
こうしなくともGitで管理をする手もあります。プログラムであればこちらの方が標準でしょう。

ただし、一部の場面で適当な名前をつけても問題ない場合があります。
一時ファイルとして一時的に保存する、場所を指定して(特にデスクトップであれば)配置する、などなどそのファイルを管理できるなら問題ないです。

ファイルの場所問題

おや、さきほどのフォルダー問題で解決したのではないか?
そう思うのも無理はありません。なんたってあれはファイルの内容によって入れる場所を規格化する考えでしたから。
ここでの問題は、「複数の情報を持つファイルをどこに保管するか」についてです。

もしあなたがゲームクリエイターだとして、クリエイティブ・コモンズのBGMを使用しようとダウンロードします。
実際はファイルをプロジェクト傘下に置きますが・・・ここではファイルのパスを読み込んで再生する手順を考えます。
ではこの場合、ファイルをどこに置きましょうか?

Document
├─ Free_Resource
│  ├─ Music
│  └─ BGM
│     └─ CC
├─ BGM
│  └─ CC
├─ CC_Resource
│  └─ BGM
└─ Resource
   └─ CC
      └─ BGM
Music
├─ Resource
│  └─ CC
├─ Free_Resource
│  └─ CC
├─ Free_Music
│  └─ CC
├─ Free_BGM
│  └─ CC
└─ CC_Resource
   ├─ CC_Music
   └─ CC_BGM

ここで挙げたフォルダー以外にもまだまだ名前は思いつきますが、とにかく、素材であることを重視したいのか、クリエイティブ・コモンズの音源であることを重視したいのか、はたまたといったようにいろいろな選択肢が生まれます。

ここで大事なのは、同じ役割を持つフォルダーは一つのみを心がけることです。

例えばこのようなフォルダーを作ったとしましょう。

  • Projects_Unity
  • Game_Unity
  • Creat_Unity
  • Example_Unity
  • Learn_Unity
  • My_Unity

一見すると役割が分担しているように見えますね(実際管理できる人はこれでも問題ない)。
しかし、自らの手で作成したUnity製のゲームを管理すると様々な選択肢が生まれます。
my_gameのプロジェクトをProjects_UnityCreat_UnityMy_Unityのどこかに入れ、バイナリ化したファイルをGame_UnityCreat_UnityMy_Unityのどこかに入れる選択肢が生まれます。
そうでなく学習用にダウンロードしたプロジェクトでもProjects_UnityExample_UnityLearn_Unityのどこかに入れる選択肢が生まれます。

このように複数の選択肢が生まれてしまった場合、保存する場所がばらけてしまう可能性が生まれます。
そのため、自分の操作スタイルに合わせて、役割に合ったフォルダー階層を作ることを心がけましょう。

ディレクトリの移動

さて、ここまでフォルダーの階層整理や命名の規格化などを考えました。
では、フォルダー間を移動するときはどうしましょうか。ファイラーでちまちま移動するのもいいですが、ソフトを使って移動する方法も考えるとよりよいです。

ランチャーソフト

ランチャーソフトとは、特定のキーを押すことで選んだソフトが開くようにするソフトのことです。ようは、ファイラーを開かずともファイルを選べるようになったりします。
ここでは、PowerToysのPowers Toy Runを使って説明します。

PowerToys Run
ここではアプリケーションの名前を入れていますが、もちろんフォルダー名を入れることでフォルダーを開くことができます。

ここで先ほどの命名の規格が役に立ってきます。
ランチャーソフトからプログラムのコードが入ったフォルダーを探したいとします。
pro_pと打つことでProgram_Pythonのフォルダーを、pro_dと打つことでProgram_Dを開けたりします。
もちろんこれは一例にすぎませんが、ファイルとフォルダーを探せるランチャーソフトであれば特定の単語で探したいファイルをすぐに開くことができます。

また、ネットからダウンロードしたファイルは、名前別や拡張子別にそれぞれ設定したフォルダーに送られるようなプログラムを組むのもいいでしょう。

CLI

コマンドラインツールで移動するときも同様に命名規則が役に立ちますが、ここまで読んだのならば利点は分かるはずです。
ここではzoxideとyaziというソフトがあることだけ伝えておきます。
https://github.com/ajeetdsouza/zoxide
https://github.com/sxyazi/yazi

まとめ

( ゚Д゚) < ここまで長々と書きましたが、最初から最後まで保存するファイルやフォルダの命名規則は決めておこうという至極全うなことしか書いていません。以上です。

Discussion