はじめに
ファイルを先にサーバーにアップロードしておきたいけれど、そのファイルの存在は事前に知られたくない(URLを推測され画像を見られたくない)ということが稀にあります。
誰でも使えるようにシェルスクリプトを作成しましたので、備忘録として残したいと思います。
動作確認環境
- Windows10 Home
- Git Bash
使い方
拡張子が.shで終わるファイルを作成します。
以下のサンプルを貼り付けます。
ファイルをダブルクリックすると、シェルスクリプトと同階層にあるファイルのファイル名がすべて難読化されます。
サンプル
# !/bin/bash
# ファイル名をハッシュ値に変換する
# 参考:
# https://stackoverflow.com/questions/8201729/rename-files-to-md5-sum-extension-bash
# コピー先のディレクトリを作成(-pをつけることで存在している場合は作成しない)
mkdir -p ../work
# もとファイルを作業ディレクトリにコピー
for filepath in `find -name '*.png'`
do
filename=`basename ${filepath}`
cp ${filepath} ../work/${filename}
done
# 作業ディレクトリ内に移動し、ファイル内のものをハッシュ化
cd ../work
md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/' | sh
# 入力あるまで待機
read -p "Complete. Press any key: "
応用
サンプルをもとに、差分のテキスト出力やすでに難読化しているものは除外する処理の追加などの改良を加えました。
こちらの方がより柔軟な使い方がができるので、利用する際はこちらをオススメします。
# !/bin/bash
# ファイル名をハッシュ値に変換する
# ファイル名だけを変えてもハッシュ値は同じです。ファイルの中身によってハッシュ値が決まります
# コピー先のディレクトリ名
output_directory_name=output
# 現在のディレクトリ名を取得
current_directory_path=$(cd $(dirname $0);pwd)
directory_name=`echo "$current_directory_path" | sed -e 's/.*\/\([^\/]*\)$/\1/'`
# コピー先のディレクトリを作成(-pをつけることで存在している場合は作成しない)
mkdir -p ../$output_directory_name/$directory_name
# 実行回数カウンター
run_count=0
# もとファイルを作業ディレクトリにコピー
for file_path in `find -name '*.png' -or -name '*.jpg'`
do
# 拡張子の取得
extension=${file_path##*.}
# ファイル名の取得
file_name=`basename ${file_path}`
# ハッシュ値のみを取得
hash_name=($(md5sum ${file_path}))
# 出力先のパスを取得
output_path=../${output_directory_name}/${directory_name}/${hash_name}.${extension}
# ファイルが存在していなければ処理を実行(-eをつけることでファイルの存在をチェック)
if [ ! -e ${output_path} ]; then
# ハッシュへの変換履歴を残す
echo "${file_name},${hash_name}.${extension}" >> ../${output_directory_name}/${directory_name}/hash_diff.csv
# ハッシュ化したものを別ディレクトリにコピー
cp -v ${file_path} ${output_path}
# 実行回数を加算
run_count=$(($run_count + 1))
fi
done
# 何も処理しなかった場合は明示的に画面に表示する
if [ ${run_count} -eq 0 ]; then
echo "There was no target."
fi
# 入力あるまで待機
read -p "Complete. Press any key."
参考ページ