ちょっといきぬき

vimとかpythonとかロボットとかMLとか環境構築とかの興味ある技術のことを書きたいだけの人生だった。

AutomatorのPythonでファイル一括操作した

f:id:hi_ro_kun28:20190606204558p:plain

環境

メイン環境
MacOS X Sierra 10.12.6 (16G2016)

サブ環境
MaxOS X Mojave

やりたかったこと

一括でディレクトリ内の画像ファイルを同じ名前のディレクトリに入れたい

つまり、これを

images
├a.png
└b.png

こう

images
├a
│└a.png
└b
 └b.png

最初にやってだめだったこと

シェルスクリプトを組んでターミナルから叩いてもらう

images
├a.png
├b.png
└mkdir_and_mv_images.sh

mkdir_and_mv_images.sh

#!/bin/sh

for filename in *.png; do
  echo $filename
  fname=`echo $filename | sed "s/\.[^\.]*$//"`
  echo "$fname"
  mkdir "$fname"
  mv "$filename" "$fname"
done
$ cd /path/to/images/directory
$ chmod +x mkdir_and_mv_images.sh
$ ./mkdir_and_mv_images.sh

なぜだめだったか

  • 動くけど繰り返したいときに手間かかる
  • 使用者がデザイナーで黒い画面きらい

更に試してだめだったこと

Automatorでサービスを作り、その中でシェルスクリプト動かす。
サービスファイルをインストールしたらimagesディレクトリを右クリックしてメニューから選ぶだけ。

f:id:hi_ro_kun28:20190606205726p:plain

右クリックしたディレクトリまでのパスが$1に入る。

#!/bin/sh

cd $1

for filename in *.png; do
  echo $filename
  fname=`echo $filename | sed "s/\.[^\.]*$//"`
  echo "$fname"
  mkdir "$fname"
  mv "$filename" "$fname"
done

なぜだめだったか

Sierraだと動くけどMojaveだとmkdirコマンドでPermission deniedになる。

回避できず、謎すぎてはげる

解決策

前置きが長い。

Automatorのサービスの中でPythonスクリプトを動かして解決した。

f:id:hi_ro_kun28:20190606205930p:plain

# coding: utf-8

import os
import sys
import glob
import shutil

dir = sys.argv[1]
os.chdir(os.path.expanduser(dir))
print(os.getcwd())
files = glob.glob('./*.png')

for f in files:
    name, ext = os.path.splitext(f)
    os.mkdir(name)
    shutil.move(f, name)

てか標準出力表示したいんだけど

出し方がよくわかんない、なんかうまくメッセージダイアログに出せないし、 raise Exception('error')とかしてもでない。謎。

せめてここの結果に出したいけどそのまま実行ボタン押してもsys.argvの中身無いからエラーで止まる

f:id:hi_ro_kun28:20190606210404p:plain

「パス」という項目があったので試しに置く

f:id:hi_ro_kun28:20190606210734p:plain

この「~/Desktop」の値が全くいじれねんけど!!!!!!!!!!!!

f:id:hi_ro_kun28:20190606210914p:plain

ここ押さなきゃ編集できないとか罠でしょ…

f:id:hi_ro_kun28:20190606211115p:plain

できた。