logo
Published on

Bash リモートサーバーにファイルをコピーして共有のためのURLを取得する

Authors

Bash言語でリモートサーバーにファイルをコピーして共有のためのURLを取得するプログラムについて紹介します。

ローカルファイルをリモートサーバーにコピーしたのち、クリップボードにそのURLをコピーします。テキストファイルやメディアファイルを手早く共有したい場合に便利。 サーバー名は僕の環境のエックスサーバーのものになっていますので、そこらへんは適当に変えてください。


# リモート;remoteにファイルをコピーして共有のためのURLを取得 e.g. images,videos,files,etc
sharefile(){

  : e.g. sharefile "/mnt/e/_downloads/MOV_0070.mp4"

  # filepath="/mnt/e/_downloads/MOV_0070.mp4"
    filepath=$(realpath "$1")

  cp "${filepath}" "${filepath}.tmp"

  filedir=$(dirname "$filepath")
  filename=$(basename -- "$filepath")
  extension="${filename##*.}"

  random=$(random|chomp)

  if [[ $string =~ .*\..* ]]
  then
  mv "$filepath" "$filedir/${random}"
  newFilepath="$filedir/${random}"
  newFilename="${random}"
  touch "${filedir}/${filename} is ${random}.is.tag"
  else
  mv "$filepath" "$filedir/${random}.$extension"
  newFilepath="$filedir/${random}.$extension"
  newFilename="${random}.$extension"
  # set -x
  touch "${filedir}/${filename} is ${random}.${extension}.is.tag"
  # set +x
  fi

  rsync -e 'ssh -p 10022 -i ~/.ssh/yuis.key' -r "${newFilepath}" yuis@sv2031.xserver.jp:"~/yuis.xsrv.jp/public_html/data/"

  mv "${filepath}.tmp" "${filepath}"

  echo "https://yuis.xsrv.jp/data/${newFilename}" | clip && printf "\n\n${blu}https://yuis.xsrv.jp/data/${newFilename}${end} is clipped.\n\n"

}

このシェルスクリプトは、ファイルをリモートサーバーにコピーし、共有用のURLを取得するための関数 sharefile を定義しています。以下では、スクリプトの動作をステップバイステップで説明します。

  1. sharefile 関数が定義されています。この関数は、引数としてファイルパスを受け取ります。

  2. filepath=$(realpath "$1"):渡されたファイルパスを取得し、$filepath に格納します。realpath コマンドは、相対パスを絶対パスに変換します。

  3. cp "${filepath}" "${filepath}.tmp":元のファイルをコピーして、.tmp の拡張子を付けた一時ファイルを作成します。これにより、元のファイルを一時的にバックアップします。

  4. filedir=$(dirname "$filepath"):ファイルのディレクトリパスを filedir に格納します。

  5. filename=$(basename -- "$filepath"):ファイルのベース名(ファイル名)を filename に格納します。

  6. extension="${filename##*.}":ファイルの拡張子を extension に格納します。この行は、拡張子を抽出するための一連の文字列操作を実行しています。

  7. random=$(random|chomp)random 変数にランダムな文字列を生成し、格納します。ただし、スクリプトの中で random 関数が定義されていないため、この行はエラーを生成します。

  8. if [[ $string =~ .*\..* ]]:条件文が始まりますが、$string はスクリプトの中で定義されていないため、ここに不明な変数が含まれています。この条件文の目的が不明確です。

  9. mv "$filepath" "$filedir/${random}":元のファイルをランダムな名前にリネームします。リネーム後、新しいファイルのパスを newFilepath に格納し、新しいファイルの名前を newFilename に格納します。さらに、ファイルにタグを付けるために touch コマンドを使用します。

  10. rsync -e 'ssh -p 10022 -i ~/.ssh/yuis.key' -r "${newFilepath}" yuis@sv2031.xserver.jp:"~/yuis.xsrv.jp/public_html/data/"rsync コマンドを使用して、新しいファイルをリモートサーバーにコピーします。このコマンドは、SSH経由で接続し、指定されたリモートディレクトリにファイルをコピーします。

  11. mv "${filepath}.tmp" "${filepath}":一時的に作成したバックアップファイル(.tmp 拡張子を持つ)を元のファイル名に戻します。

  12. echo "https://yuis.xsrv.jp/data/${newFilename}" | clip && printf "\n\n${blu}https://yuis.xsrv.jp/data/${newFilename}${end} is clipped.\n\n":新しいファイルの共有URLを出力し、クリップボードにコピーします。また、メッセージを表示しますが、${blu}${end} はカラーコードを表しており、テキストの色を変更するために使用されるものです。

上記のように、このシェルスクリプトは、ファイルをリモートサーバーにコピーし、共有用のURLを取得するための関数 sharefile を定義しています。この関数は、引数としてファイルパスを受け取ります。この関数を使用するには、次のようにします。

sharefile "/mnt/e/_downloads/MOV_0070.mp4"