【Mac】片付けフォルダを作る

Mac のフォルダにはフォルダアクションという、そのフォルダに入れたファイルになんらかの処理をほどこす仕掛けがある。
 これは Automator で簡単に作れるので、片付けフォルダ、みたいなものを作ることにした。そのフォルダに画像を入れると、ピクチャフォルダのなかの「使うかもしれない画像」に片付ける。書類を入れると書類フォルダの「使うかもしれない書類」フォルダに、動画の場合はムービーフォルダの「使うかもしれない動画」に片付ける。
 ただし、本当に必要かどうかの判断をしたいので、最後に手を加えてから最低三日間は、そのフォルダに留めておきたい。

フォルダアクション

Automator の新規作成でフォルダアクションを選択する。

以下のように組み合わせれば、イメージだけは「使うかもしれない画像」フォルダに送れる。しかし、ファイルの種類によって配送するフォルダを変えるにはどうしたらいいかわからない。

ということでいつものように、ここではシェルスクリプトを使う。

シェルスクリプト

📝 kataduke.sh
for f in "$@"
do
	modTime=`stat -f %m "$f"`
	threedays=`echo $((86400 * 3 + modTime))`
	todayTime=`date "+%s"`
	if test $todayTime -lt $threedays; then
		continue
	fi

	FileName=`basename "$f"`
	case "$1" in
		*.png|*.jpg|*.gif|*.jpeg)
		if echo "$FileName" | grep -sq 'スクリーンショット'; then
			mv "$f" ~/Pictures/スクショ/
		else
			mv "$f" ~/Pictures/使うかもしれない画像/
		fi ;;
		*.txt|*.pdf|*.rtf|*.sh|*.md|*.rtfd)
			mv "$f" ~/Documents/使うかもしれない書類/ ;;
		*.mov|*.mp4|*.mkv|*.flv|*.avi)
			mv "$f" ~/Movies/使うかもしれない動画/ ;;
		*.webloc)
			mv "$f" ~/Desktop/倉庫/webloc/ ;;
		*)
			;;
	esac
done

stat コマンド

stat -f %m "$f" で、ファイルの最終更新日時を取得している。
 stat はファイルの詳細情報を返してくれるコマンドだ。

$ stat -x ~/Desktop/IMAGE.png
File: "/Users/user/Desktop/IMAGE.png"
  Size: 125957       FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/user)  Gid: (   20/   staff)
Device: 1,4   Inode: 8613802292    Links: 1
Access: Wed Feb 20 20:58:32 2019
Modify: Wed Feb 20 03:41:58 2019
Change: Wed Feb 20 03:41:59 2019

%m はモディファイを表示するフォーマットだ。%c という最終更新日時を示すフォーマットもあるのだが、これはチェンジで、ファイルを移動させただけで更新されてしまう。モディファイはなんらかの加工や編集が加えられた時間、ということらしい。

%m で返される時刻は UNIXTime である。これを普通の時間で表示するには、%S をつける。S は文字列をあらわすストリングだと思われる。この時刻は -t オプションでフォーマットを指定することも可能だ。こんな風に書く。

$ stat -t "%Y年%m月%d日 %H時%M分%S秒" -f %Sm ~/Desktop/IMAGE.png
2019年02月20日 03時41分58秒

stat のオプションは以下のページを参考にさせていただいた。

🔗 stat(1) FreeBSDドキュメントJMan

上のシェルスクリプトでは、ファイルネームを取得して、 echo "$FileName" | grep -sq 'スクリーンショット' で、スクリーンショットだけは別のフォルダに移動することにした。

シェルスクリプトの修正

上のシェルスクリプト、kataduke.sh を Automator でフォルダアクションとして保存すると、想定通り、片付けフォルダに追加したファイルを振り分けてくれる。
 作ったばかりのファイルは、片付けフォルダのなかにとどまって片付けない。
 しかしながら、このファイルがいつまでたっても片付かないのだ。
 ファイルを追加した時点で、フォルダ内のすべてのファイルを対象に処理してくれるのかと思ったら、違うらしい。あくまで追加されたファイルにだけ上記のスクリプトが実行されるに過ぎない。
 しょうがないので書き直した。

function checkMod() {
	modTime=`stat -f %m "$1"`
	threedays=`echo $((86400 * 3 + modTime))`
	todayTime=`date "+%s"`
	if test $todayTime -lt $threedays; then
		echo 'stay'
	else
		echo 'go'
	fi
}

function furiwake() {
	FileName=`basename "$1"`
	case "$1" in
		*.png|*.jpg|*.gif|*.jpeg)
		if echo "$FileName" | grep -sq 'スクリーンショット'; then
			mv "$1" ~/Pictures/スクショ/
		else
			mv "$1" ~/Pictures/使うかもしれない画像/
		fi ;;
		*.txt|*.pdf|*.rtf|*.sh|*.md|*.rtfd)
			mv "$1" ~/Documents/使うかもしれない書類/ ;;
		*.mov|*.mp4|*.mkv|*.flv|*.avi)
			mv "$1" ~/Movies/使うかもしれない動画/ ;;
		*.webloc)
			mv "$1" ~/Desktop/倉庫/webloc/ ;;
		*)
			;;
	esac
}

for f in "$@"
do
	if test `checkMod "$f"` = 'go'; then
		furiwake "$f"
	else
		continue
	fi
	
done

cd ~/Desktop/片付け

ls -1 | while read line
do
	if test `checkMod "$line"` = 'go'; then
		furiwake "$line"
	else
		continue
	fi
done

投入されたファイルを処理した後、片付けフォルダに残るすべてのファイルを対象に、もう一度、更新日時をチェックする。
 これで想定の動作をするようになった、と思う。

このフォルダアクションは、右クリックメニューの「サービス」>「フォルダアクション設定…」で削除できる。それ専用の「フォルダアクション設定」というアプリが起動する。

フォルダアクション設定で、ワークフローを編集することもできる。ちなみにワークフローは、~/ライブラリ/Workflows/Applications/Folder Actions/ のなかに保存される。