0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ファイル名を難読化する方法

Last updated at Posted at 2021-11-28

はじめに

ファイルを先にサーバーにアップロードしておきたいけれど、そのファイルの存在は事前に知られたくない(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."

参考ページ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?