我在文件(本地)中有一个图像列表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
或循环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