Bash

使用本地列表從遠端下載圖像

  • November 19, 2021

我有一個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

我會使用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

引用自:https://unix.stackexchange.com/questions/678089