- Published on
Bash リモートサーバーにファイルをコピーして共有のためのURLを取得する
- Authors
- Name
- Shou Arisaka / 有坂翔
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
を定義しています。以下では、スクリプトの動作をステップバイステップで説明します。
sharefile
関数が定義されています。この関数は、引数としてファイルパスを受け取ります。filepath=$(realpath "$1")
:渡されたファイルパスを取得し、$filepath
に格納します。realpath
コマンドは、相対パスを絶対パスに変換します。cp "${filepath}" "${filepath}.tmp"
:元のファイルをコピーして、.tmp
の拡張子を付けた一時ファイルを作成します。これにより、元のファイルを一時的にバックアップします。filedir=$(dirname "$filepath")
:ファイルのディレクトリパスをfiledir
に格納します。filename=$(basename -- "$filepath")
:ファイルのベース名(ファイル名)をfilename
に格納します。extension="${filename##*.}"
:ファイルの拡張子をextension
に格納します。この行は、拡張子を抽出するための一連の文字列操作を実行しています。random=$(random|chomp)
:random
変数にランダムな文字列を生成し、格納します。ただし、スクリプトの中でrandom
関数が定義されていないため、この行はエラーを生成します。if [[ $string =~ .*\..* ]]
:条件文が始まりますが、$string
はスクリプトの中で定義されていないため、ここに不明な変数が含まれています。この条件文の目的が不明確です。mv "$filepath" "$filedir/${random}"
:元のファイルをランダムな名前にリネームします。リネーム後、新しいファイルのパスをnewFilepath
に格納し、新しいファイルの名前をnewFilename
に格納します。さらに、ファイルにタグを付けるためにtouch
コマンドを使用します。rsync -e 'ssh -p 10022 -i ~/.ssh/yuis.key' -r "${newFilepath}" yuis@sv2031.xserver.jp:"~/yuis.xsrv.jp/public_html/data/"
:rsync
コマンドを使用して、新しいファイルをリモートサーバーにコピーします。このコマンドは、SSH経由で接続し、指定されたリモートディレクトリにファイルをコピーします。mv "${filepath}.tmp" "${filepath}"
:一時的に作成したバックアップファイル(.tmp
拡張子を持つ)を元のファイル名に戻します。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"