파일이 너무 많아서 특정 대상이 있는 원격 컴퓨터에 업로드해야 합니다. 다음과 같은 지도가 있습니다(재구성 가능).
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
두 가지 해결책을 생각해 볼 수 있습니다.
특정 대상에 업로드
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
연결을 갖는 것은 효율적이지 않습니다.
질문:(속도를 위해) 하나의 연결로 여러 파일을 업로드하기 위해 유사한 방법을 어떻게 사용할 수 있습니까 scp
?
rsync를 사용하여 업로드한 다음 일괄 이름 바꾸기
를 사용하여 전체 폴더를 rsync
임시 폴더에 업로드할 수 있는데, 이는 매우 빠릅니다. 그런 다음 위 이미지에 따라 파일 이름을 바꿉니다.
질문:주어진 지도를 사용하여 일괄 이름을 바꾸는 방법은 무엇입니까?
답변1
세 번째 솔루션에서는 모든 소스 파일이 동일한 파일 시스템에 있어야 하므로 모든 파일을 임의로 하드 링크할 수 있습니다.
파일 매핑을 file 에 저장합니다 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