images.txt
다음과 같은 상대 이미지 경로가 있는 파일(로컬)에 이미지 목록이 있습니다 .
a/b/abc.jpg
a/b/abcd.jpg
1/2/123.jpg
1/2/1234.jpg
...
폴더 구조를 유지하면서 원격에서만 해당 이미지를 다운로드하고 싶습니다.
나는 다음과 같이 명령을 사용해 보았습니다.
cd /path/to/my/project
scp -rv user@remote-host:/var/www/domain.com/public_html/assets/media/{"$(cat images.txt | tr '\n' ',' | sed 's/,$//')"} ./assets/media
./assets/media
그러나 개별 폴더(예: 등) 대신 a/b
디렉터리 1/2
의 모든 이미지를 직접 다운로드합니다 .
명령을 수정하는 방법은 무엇입니까? 사용 중이 rsync
거나scp
답변1
사용 가능한 항목에 따라 rsync
or loop 를 사용합니다 .scp
while IFS= read -r file
do
mkdir -p "assets/media/${file%/*}"
scp -pv user@remote-host:"/var/www/domain.com/public_html/assets/media/$file" assets/media
done <images.txt
just를 사용할 때의 문제점은 scp
소스 경로에 해당하는 디렉터리가 자동으로 생성되지 않으므로 명시적으로 생성해야 한다는 것입니다.
rsync
내가 주로 사용하는 도구는 단일 명령으로 이 모든 것을 처리할 수 있는 것 같습니다.
rsync -avR --files-from images.txt user@remote-host:/var/www/domain.com/public_html/assets/media/ assets/media
여기서 "마법"은 나열할 소스 경로가 소스뿐만 아니라 대상에도 상대적임을 -R
알려주는 플래그 입니다. 그러면 원격 시스템에서 로컬 시스템으로 복사됩니다.rsync
images.txt
/var/www/domain.com/public_html/assets/media/a/b/abc.jpg
assets/media/a/b/abc.jpg
나중에 생각해 보면 파일 이름 목록이 배열에 있는 경우 파일 이름 목록을 처리하는 방법을 묻는 의견이 있었습니다. 이게 내가 할 수 있는 일이야
printf "%s\0" "${files[@]}" |
rsync -avR --files-from - --from0 user@remote-host:/var/www/domain.com/public_html/assets/media/ assets/media