Site cover image

ふつうのITエンジニアの独り言

本業はAndroidとiPhoneのアプリ開発のエンジニアです。将来はフリーランスで海の近くで妻とのんびり暮らすことを夢見て、幅広くIT技術に触れていきたいと思います。このブログはその備忘録と私のポートフォリオとして活動記録を記すものです。

Macの特定のフォルダに格納されたファイルを自動で整理したい

目次


ダウンロードフォルダのapkファイル問題


 AndroidアプリをJenkinsでビルドしてapkをダウンロードしたとき、apkファイルを一旦別のフォルダに移動している。それは何故かというと、apkファイルをインストールする時に以下のコマンドを実行するためである。

adb install <ファイル名>.apk

 もちろん、ダウンロードフォルダの中にあっても、このコマンドは実行できるが、ファイル数が多くなってくるとapk名を入力する手間が増えてくる。その入力の手間を減らすために、別のフォルダに移動しているのです・・・。

 フォルダの新規作成から、apkを移動させて、ターミナルを開いてインストールコマンドを実行するという一連の作業のうち、apkの移動を自動化できれば、少しは作業が楽になるのではないか?と考え、ダウンロードフォルダに保存されたapkファイルを自動で振り分ける方法を考える。

仕様検討


 apkファイルに限らず、任意の識別子のファイルを自動で振り分けられるようにすると、いろいろな作業が捗るかもしれないので、自動振り分けの仕様は以下のようにした。

  • ダウンロードフォルダに、__<識別子>__のフォルダがある場合に、該当の識別子をそのフォルダに格納する。
  • ダウンロードフォルダにファイルが保存されるたびに自動実行される。
  • 振り分け時にファイル名が重複する場合は、ファイル名の先頭に”yyyyMMddHHmmss_”を付与して、上書きされることを防ぐ

実現方法の検討


 MacではAutomatorという標準のアプリが入っており、これを使うと任意のフォルダに対してイベントが発生した時に、シェルスクリプトを実行することができるらしい。なるほど・・・これを使えば簡単に実現できそうでした。

Autometerの準備


① MacでAutomatorを探して実行すると、最初に書類の種類選択を求められる。このなかに、フォルダアクションがあるので、これを選択する。

② 左のメニューから”ユーティリティ” > “シェルスクリプトを実行”を選択する。

③ フォルダアクションを実行したいフォルダを右上で選択する。ここではダウンロードフォルダを選択した。

④ 実行するアクションをシェルスクリプトに記述する。処理の大まかな流れは、以下の通り。

  1. 自動振り分け対象の識別子リスト作成
  2. ファイルの識別子を一つずつ比較
  3. ファイルを上書きしないように移動

ちなみに、2の処理で、識別子は”MP4”と”mp4”のように大文字/小文字で表記される場合があるため、識別子の比較処理は大文字と小文字を区別しないように工夫している。

DOWNLOAD_DIR="$HOME/Downloads"

# 自動移動させるファイルの拡張子を抽出する。
# フォルダ名が__xxx__がある場合、xxxの拡張子を自動移動の対象とする
EXTENTIONS=()
for dir in "${DOWNLOAD_DIR}"/*; do
 	folder_name=$(basename "$dir")
  	# __xxx__ の形式に一致するか確認
  	if [[ "$folder_name" =~ ^__(.+)__$ ]]; then
    	EXTENTIONS+=("${match[1]}")
  	fi
done
echo "${EXTENTIONS}"

for file in "${DOWNLOAD_DIR}"/*
do
	if [[ -f "$file" ]]; then
		# ファイルの場合
		
		filename=$(basename "${file}")
		# 拡張子取得
		ext="${file##*.}"

		# 識別子を確認する
		for extention in $EXTENTIONS
		do
			if [ "$(echo "$ext" | tr '[:upper:]' '[:lower:]')" = "$(echo "$extention" | tr '[:upper:]' '[:lower:]')" ]; then
				# 大文字小文字を区別せずに、拡張子が一致する場合
				
				new_file="${DOWNLOAD_DIR}/__${ext}__/${filename}"

				echo "${new_file}"
				if [ -e "${new_file}" ]; then
					# 同名のファイルが存在する場合は、時刻情報をつけて移動する
					time=`date '+%Y%m%d%H%M%S'`
					mv "${file}" "${DOWNLOAD_DIR}/__${ext}__/${time}_${filename}"
				else
					# 同名のファイルが存在しない場合
					mv "${file}" "${DOWNLOAD_DIR}/__${ext}__"
				fi		
			fi
		done
	fi
done

動作確認


 ダウンロードフォルダに、”__txt__”フォルダを作成し、txtファイルを保存すると、自動で”__txt__”フォルダに移動されるのを確認できた。また、同じファイル名の場合は、日時が先頭につくことも確認できる。

まとめ


 ダウンロードフォルダに”__apk__”フォルダを作成することで、Jenkinsからダウンロードしたファイルが自動でapkフォルダに振り分けられるので、アプリのインストールが楽になったと感じられた。他にも、”__ipa__”や”__zip__”、”__pdf__”フォルダなども作成したが、今のところ不便は感じないので、自動振り分けして良かった。