リモートおよびローカルリストから画像をダウンロードする

リモートおよびローカルリストから画像をダウンロードする

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内のすべての画像を直接ダウンロードします。

コマンドを修正するには?使用rsyncscp

答え1

利用可能な項目に応じてrsyncorループを使用してください。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

関連情報