- 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}" [email protected]:"~/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"