私は資料の画像ファイルは、Mac内のフォルダ分けして管理しています。似たようなフォルダの中身を一箇所に集めたい、ということがけっこうあります。
いちいちファイルをマウス操作で移動したり、不要になったフォルダを削除するのは大変で、ついつい後回しになってしまいます。
そこで、今回はフォルダに小分けしすぎたファイルをまとめるコマンドラインを見ていきましょう。
フォルダのフラット化
下位フォルダのすべてのファイルを、一箇所のフォルダに移動する操作のことを、「ディレクトリ構造のフラット化(flatten directory structure)」といいます。
なかなか日本語ではキーワードが探しにくいですが、「flatten folder」などと検索すると結果が出てきます。
フラット化にはfindコマンドを利用します。
カレントフォルダ(ターミナルの作業フォルダ)内でフラット化する場合は、以下のようなコマンドを実行します。
find . -mindepth 2 -type f -exec mv -i '{}' . ';'
コマンドの意味としては、2階層目以下(-mindepth 2)のファイル(-type f)を探して(find)、それぞれに移動(mv)処理を実行(-exec)します。
2箇所に「.」がありますが、これで検索対象と移動先にカレントフォルダを指定しています。
実際にターミナルで実行してみます。

このようになりました。

こちらを参考にしました。
空のフォルダをまとめて削除する
あとは空のフォルダが残っているのが気になります。
まとめて削除するのにもfindコマンドを使います。
find . -type d -empty -delete
カレントフォルダ(.)のディレクトリ(-type d)で空(-empty)のものを探して(find)、削除(-delete)します。

を実行すると…

コマンドとして登録しておく
毎回、このコマンドを入力するのも大変なので、スクリプトにしておきます。
アプリケーションの「Automator」を起動します。

まずは、「ファイル」メニューから「新規作成」で、「クイックアクション」を選びます。

左の「アクション」から、「ユーティリティ」の「シェルスクリプトを実行」を右にドラッグします。

ワークフローの受け取る現在の項目を「フォルダ」、検索対象を「Finder.app」にします。

「入力の引き渡し方法」から「引数として」を選び、コードの中身を入力します。
for f in "$@"
do
cd "$f"
find . -mindepth 2 -type f -exec mv -i '{}' . ';'
find . -type d -empty -exec rm -ri '{}' \;
done
「ファイル」メニューから「保存」を選んで、名前を入力します(ここでは「フォルダフラット化.workflow」)。
これで、フォルダを右クリックする「クイックアクション」に項目が追加されました。

実行してみましょう。

ただ、なぜかフォルダの削除がうまくいっていません。残ってしまっているんですよね。
どうも、「実行権限がない」か「フォルダが空ではない扱い」で、フォルダを削除できていません。
この原因については、今後の課題ということで、また研究していきます。
今回は、フォルダ操作でシェルスクリプトを実行するために、クイックアクションを作成してみました。
AutomatorはExcelのマクロのようなもので、いろいろな定型作業を自動化できるとよいですよね。
こちらもどうぞ

