Watch

Mac OS X のコマンドラインからネストされたディレクトリとファイル階層をフラット化する

Mac OS X のコマンドラインからネストされたディレクトリとファイル階層をフラット化する

OS Xのターミナルディレクトリ構造をフラット化し、ディレクトリの子フォルダにあるすべてのファイルコンテンツを1つのフォルダに移動する必要があったことはありませんか?Mac OS XやLinuxのファイルシステムからファイルやフォルダを手動で移動することもできますが、より速い方法はコマンドラインを使うことです。例えば、ある時点でネストされたディレクトリ階層を作成してしまい、そのネストされたフォルダからすべてのファイルを1つのディレクトリに戻して元に戻す必要がある場合や、ディレクトリ構造を簡素化したい場合など、理由は問わず、このトリックは非常に有効です。


コマンドラインを使ってファイルやディレクトリ構造をフラット化するのは、ターミナルを使い慣れた上級ユーザー向けです。もしそうでない場合は、Finderを使って手動で行うか、MacのAutomatorアプリを使ってファイルシステムの操作を自動化することを検討してください。ただし、ここではコマンドラインからのディレクトリフラット化に焦点を当てます。

ネストされたファイルディレクトリをフラット化する例

何をしようとしているのかをより深く理解するために、ユーザーのホームフォルダにある TestDirectory という架空のディレクトリ構造を例に挙げてみましょう。この例では、TestDirectory には SubDirectory1、SubDirectory2、SubDirectory3 といったサブフォルダが含まれており、それぞれのフォルダ内にファイルが保存されています。ここで目指しているのは、ディレクトリ構造をフラット化し、SubDirectory(X) にあるすべてのファイルを親ディレクトリ「TestDirectory」に移動することです。 で再帰的に表示される初期ディレクトリとその内容は、次のようになります。

$ find ~/TestDirectory/ -type f
~/TestDirectory/rooty.jpg
~/TestDirectory/SampleDirectory1/beta-tool-preview.jpg
~/TestDirectory/SampleDirectory1/alphabeta-tool.jpg
~/TestDirectory/SampleDirectory2/test-tools.jpg
~/TestDirectory/SampleDirectory3/test-png.jpg
~/TestDirectory/SampleDirectory3/test1.jpg
~/TestDirectory/SampleDirectory3/test2.jpg

このディレクトリとサブディレクトリの内容を TestDirectory フォルダに戻すには、次のコマンド文字列を使用します。

find TargetDirectory/ -mindepth 2 -type f -exec mv -i '{}' TargetDirectory/ ';'

ディレクトリの内容がフラット化された後、リストすると次のようになります。

~/TestDirectory/rooty.jpg
~/TestDirectory/beta-tool-preview.jpg
~/TestDirectory/alphabeta-tool.jpg
~/TestDirectory/test-tools.jpg
~/TestDirectory/test-png.jpg
~/TestDirectory/test1.jpg
~/TestDirectory/test2.jpg

サブディレクトリは存在し続けますが、空になることに注意してください。分かりますか?もしそうでない場合、あるいはそれが目的を達成していない場合は、ディレクトリをフラット化する必要は全くなく、マージするか、ditto を使って別の場所に複雑なコピーを行うことを検討しているのかもしれません。

コマンドラインでディレクトリ構造とネストされたファイル階層をフラット化する

続行する準備はできましたか? ディレクトリ構造をフラット化し、サブディレクトリにあるすべてのファイルをターゲット ディレクトリのベースに移動するために使用するコマンド文字列は次のとおりです。

find [DIRECTORY] -mindepth 2 -type f -exec mv -i '{}' [DIRECTORY] ';'

上記の例に示すように、[DIRECTORY] をフラット化するディレクトリに置き換えます。

はい、ディレクトリはコマンド文字列に 2 回表示されます。1 回目はサブディレクトリをフラット化するために検索されるディレクトリであり、2 回目は見つかった項目の保存先です。

指定した宛先は正確にしてください。これは元に戻すことができないため (少なくとも、手動で大量の作業を行わなければ元に戻すことはできません)、ターゲット ディレクトリの子ディレクトリにあるすべてのファイルをターゲット ルート フォルダに再配置する必要があることが確実な場合にのみ、これを実行してください。

前述の通り、OS XのFinderでも同様の操作が可能です。少なくとも、Finderでファイルやフォルダの変更を確認することは可能です。リスト表示で小さな矢印をOptionキーを押しながらクリックすると、すべてのサブディレクトリが開き、フォルダ階層が次のように表示されます。

Mac OS XのFinderに表示されるネストされたディレクトリ構造をフラット化する

bashとzshの代替手段をいろいろ試した結果、StackExcangeのコメント投稿者が残してくれたこの便利なトリックが、最終的に最も簡単で互換性の高い方法であることが分かりました。ネストされたディレクトリをフラット化するより良い方法をご存知でしたら、ぜひコメント欄でお知らせください!