원격 및 로컬 목록에서 이미지 다운로드

원격 및 로컬 목록에서 이미지 다운로드

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

사용 가능한 항목에 따라 rsyncor 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알려주는 플래그 입니다. 그러면 원격 시스템에서 로컬 시스템으로 복사됩니다.rsyncimages.txt/var/www/domain.com/public_html/assets/media/a/b/abc.jpgassets/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

관련 정보