Bash
使用本地列表從遠端下載圖像
我有一個
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
我會使用
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