広告

Linuxコマンドでディレクトリのフラット化 (flatten)

タグ:linux

ディレクトリ分けされたファイルの階層構造を潰してカレントディレクトリ直下に集めることをフラット化 (flatten, 平坦化)などと呼んだりする。
ファイルを整理するつもりで必要以上にディレクトリを作ってしまったときや、機械学習用のデータローダに食わせる ときにディレクトリがあると邪魔になるときなどに使える。

やり方としてはfindコマンドで再帰的にファイルを検索しつつ、見つかったファイルに対してコマンド実行できる オプション -execでファイルの移動をしてやればよい。
これを使ってコマンドを組み立てるとfind . -type f -exec mv -i '{}' . ';'のようになる。

オプションの説明
  • type: 検索対象の種類を指定、fならファイルのみ、dならディレクトリのみ、未指定なら両方
  • exec: 実行するコマンド、{}がファイルパスに置き換えて実行される。 最後の";"は見つかったファイルそれぞれにコマンドを適用する意味。詳細はこちらを参考のこと


    # 実験用ディレクトリの確認
    $ tree
    .
    ├── a
    │   └── a.txt
    └── b
        ├── b.txt
        └── c
            └── c.txt

    # フラット化
    $ find . -type f -exec mv -i '{}' . ';'

    # 結果の確認
    $ tree
    .
    ├── a
    ├── a.txt
    ├── b
    │   └── c
    ├── b.txt
    └── c.txt
  


のようにファイルがすべて./直下に集められた。 なお空ディレクトリが残るのが気になる人は別途削除するとよい。

バリエーションとしては元のファイルを残しつつディレクトリ直下にもコピーを作る、ということもできる。
    # 実験用ディレクトリの確認
    $ tree
    .
    ├── a
    │   └── a.txt
    └── b
        ├── b.txt
        └── c
            └── c.txt

    # フラット化
    $ find . -type f -exec cp '{}' . ';'
    # 結果の確認
    $ tree
    .
    ├── a
    │   └── a.txt
    ├── a.txt
    ├── b
    │   ├── b.txt
    │   └── c
    │       └── c.txt
    ├── b.txt
    └── c.txt