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ループを使用してください。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