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

ちゃんと、サブフォルダ内のファイルが実行フォルダに集めることができました。

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

コードを実行すると、サブフォルダが消えました。

2. Automatorでクイックアクションに登録しておく
毎回、このコマンドを入力するのも大変です。フォルダの右クリックメニューから実行できるように登録しておきます。
アプリケーションの「Automator」を起動します。

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

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

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

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

実行してみましょう。

ただ、なぜかフォルダの削除がうまくいっていません。残ってしまっているんですよね。
どうも、「実行権限がない」か「フォルダが空ではない扱い」で、フォルダを削除できていません。
この原因については、今後の課題ということで、また研究していきます。
今回は、フォルダ操作でシェルスクリプトを実行するために、クイックアクションを作成してみました。
AutomatorはExcelのマクロのようなもので、いろいろな定型作業を自動化できるとよいですよね。
こちらもどうぞ
![[Mac] 移動先に同名のフォルダがある場合の置き換えと統合の注意点 【Windowsとの違い】 dittoコマンド](https://chiilabo.com/wp-content/uploads/2020/06/スクリーンショット-2020-06-12-17.35.04-160x99.png)
