Mac Automator 親フォルダ名を追加

記事内に広告やアフィリエイトリンクが含まれています。これらのリンクから商品を購入すると売り上げの一部が管理人に還元され今後の活動の助けになります。

以前紹介した拡張子ごとにフォルダを分けたりするスクリプトの続きです。
今回は選択したフォルダに親フォルダ名を追加します。
Adobe の lightroom Classicを使ったときに写真をフォルダで細かく分けておいて、複数のフォルダをまとめてjpgにする事があったのですが、その時に各フォルダ毎にjpg化してくれるのはいいのですが、各フォルダ毎にサブフォルダ(今回はjpgフォルダ)が作られてその中にjpgファイルが入ります。

/001_aaa/jpg/...
/002_bbb/jpg/...
/003_ccc/jpg/...
/004_ddd/jpg/...

何が問題かというと全てjpgフォルダに入っているのでフォルダを取り出す前にフォルダ名を変更しないといけません。
一つずつ変更するのは面倒なので有料のリネーマーも購入したのですが、Automatorのスクリプトにしてみました。
買ったのは【Name Mangler】というアプリですがやっぱり今はなき【Shupapan】の方が便利なんですよねぇ、、、辛い。

※今回紹介するスクリプトを利用して不利益が生じたとしても自己責任でお願いします。
こちらでは一切のフォローは行えません。必ず失っても良いファイルで十分に検証してください。

スポンサーリンク

手順

  1. アプリケーションフォルダーより【Automator】Automatorを起動し、1.【新規書類】をクリックし、歯車の2.【クイックアクション】を選択して、3.【選択】をクリックします。

  2. ウィンドウ右上、ワークフローが受け取る現在の項目欄で4.【フォルダ】を選び、検索対象を5.【Finder】にします。
    (これでFinderでフォルダを右クリック時にサービス欄にこのスクリプトが表示されます、【ファイルフォルダを選ぶと両方に適応できるはずです】)
  3. ウィンドウ左側、6.【ユーティリティ】から7.【シェルスクリプトを実行】をドラッグで右側グレー部分にドロップします。
  4. ドロップした【シェルスクリプトを実行】内の右上入力の引き渡し方法で8.【引数として】を選択します。
    その下、9.【入力欄】の中身に次のスクリプトをコピペして入れ替えて、わかりやすい名前(例:親フォルダ名を追加)で保存すれば終了です。
for f in "$@"
do

#fは選択したファイルパス
fname=${f##*/} #fから最後の/以前を削除してフォルダ名のみを取得

dir=${f%/*} #fからファイル名以外の部分を取得
parent=${dir##*/} #dirから最後の/より手前を削除

mv $f ${dir}/${parent}_${fname} #フォルダ名を変更

done

シェルスクリプトの解説

今回も間違ってたらごめんなさい大体あってるはず。
デスクトップにある【撮影】フォルダに入った【jpg】フォルダに対して【親フォルダ名を追加】を選択した時の挙動を例に挙げます。

  • for f in “$@”
    引数として受け取ったファイル”$@”をfに代入し一つずつに処理する
    この時点の【f】の中身はファイルのフルパスが入っています。
    例:/Users/ユーザー名/Desktop/撮影/001_aaa/jpg
  • do
    1行目forの範囲ここから
  • fname=${f##*/} #fから最後の/以前を削除してフォルダ名のみを取得
    fnameに引数として受け取った【f】から前方一致でのマッチ部分削除(最長マッチ)で、最後の【/】以前を削除して代入
    例:jpg
  • dir=${f%/*} #fからファイル名以外の部分を取得
    dirに引数として受け取った【f】から後方一致でのマッチ部分削除(最短マッチ)で、最後の【/】とフォルダ名を削除したパスを代入
    例:/Users/ユーザー名/Desktop/撮影/001_aaa
  • parent=${dir##*/} #dirから最後の/より手前を削除
    dirに入れた変数から前方一致でのマッチ部分削除(最長マッチ)で、最後の【/】以前を削除して代入
    例:001_aaa
  • mv $f ${dir}/${parent}_${fname} #フォルダ名を変更
    mvコマンドでフォルダ名の変更
  • done
    1行目forの範囲ここまで

スクリプトを実行すると、下記のように動いてくれるはずですが、間違っていると困るので十分に不要なフォルダでテストしてください。

パスの取得は下記のマッチを使用、上記スクリプトでは変数名は$f、パターンはディレクトリの【/】や拡張子手前の【.】と【*】で文字列を使用
${変数名#パターン} 前方一致でのマッチ部分削除(最短マッチ)
${変数名##パターン} 前方一致でのマッチ部分削除(最長マッチ)
${変数名%パターン} 後方一致でのマッチ部分削除(最短マッチ)
${変数名%%パターン} 後方一致でのマッチ部分削除(最長マッチ)

コメント

タイトルとURLをコピーしました