ファイルが多すぎるため、特定のターゲットを持つリモートコンピュータにアップロードする必要があります。次の地図があります(再構成可能)。
1/1/1/file.jpg -> 2/3/4/image1.jpg
2/12/2/file.jpg -> 5/6/7/image2.jpg
3/31/31/file.jpg -> 8/9/1/image3.jpg
2つの解決策を考えることができます。
特定のターゲットにアップロード
scp /folder/1/1/1/file.jpg user@ip:/dir/2/3/4/image1.jpg
scp /folder/2/12/2/file.jpg user@ip:/dir/5/6/7/image2.jpg
scp /folder/3/31/31/file.jpg user@ip:/dir/8/9/1/image2.jpg
しかし、何千ものscp
接続を持つことは効率的ではありません。
質問:(速度のために)1つの接続で複数のファイルをアップロードするために同様の方法をどのように使用できますかscp
?
rsyncを使用してアップロードしてから一括名前を変更する
を使用してフォルダ全体を一時rsync
フォルダにアップロードできます。これは非常に高速です。次に、上記の画像に従ってファイルの名前を変更します。
質問:指定されたマップを使用して一括名前を変更するには?
答え1
3番目のソリューションでは、すべてのソースファイルが同じファイルシステムに存在する必要があるため、すべてのファイルをランダムにハードリンクできます。
ファイルマッピングをファイルに保存しますfilemap.txt
。
$ cat << EOF > filemap.txt
1/1/1/file.jpg -> 2/3/4/image1.jpg
2/12/2/file.jpg -> 5/6/7/image2.jpg
3/31/31/file.jpg -> 8/9/1/image3.jpg
EOF
temp
その後、このスクリプトは、ファイルマップのターゲットパスと一致するサブディレクトリを含む一時出力ディレクトリを作成するために使用されます。各ソースファイル名は、ディレクトリの下の正しい宛先パスにハードリンクされていますtemp
。完全に入力されると、ローカルコンピュータで編集され、削除されtemp
ます。rsync
user:ip
#!/usr/bin/env bash
srcD="/folder/"
destD="/dir/"
rm -rf temp
while read src X dest
do
dir="$(dirname "$dest")"
mkdir -p "temp/$dir"
ln "$srcD$src" "temp/$dest"
done < filemap.txt
rsync -av temp/ user@ip:"$destD"
rm -rf temp