對我來說,發生的事情太多了,我無法讓我的菜鳥腦袋在這裡閒晃。我想從遠端伺服器上的多個嵌套目錄下載所有以 -123.jpg 結尾的檔案。其中一些目錄的名稱中包含空格。我認為該命令應該類似於:
scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./
…其中「parent\directory」是帶有空格的目錄名稱,指定的路徑在分割到各個子目錄之前盡可能深入,例如 dir/sub dir/[uniquely_id]-123.jpg 檔案。 (請注意,這些子目錄通常也包含空格,這會影響 * 通配符)
如果我幹預空間轉義,我會得到「不匹配」的結果,或「沒有這樣的文件或目錄」。因此,我認為我錯了的是遞歸或通配符。
提前致謝。
答案1
使用 scp 轉義檔名很棘手;您的論點在遠端得到(重新)擴展。 「有趣的」字元必須用雙引號引起來,以避免本地 shell 和遠端 shell 進行特殊處理。我希望以下兩項對您有用:
scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./
如果這令人困惑,rsync 非常容易使用(正如 Lohar 所提到的),並且透過 ssh 管道傳輸 tar 或 cpio 也非常容易。
ssh user@server 'cd /path/to/parent\ directory;
find -name "*123.jpg" -print0 | cpio -0 -o' |
cpio -i -d -v
答案2
缺乏用於測試的伺服器佈局我不知道以下命令是否實際有效,但我認為在這種情況下 rsync 會比 scp 更好,因為您可以指定輸入和排除模式。就像是:
rsync -arvzSH --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/
可能有效。但你最好仔細檢查一下rsync 文檔。
答案3
帶有通配符的 scp 的解決方法:
for i in "*-123.jpg"
do
scp $i <user>@<server>:/path/to/destination/
done
答案4
正確地應該分兩部分完成:
- 首先找到所有需要的文件並將它們複製到一個資料夾(如果您具有相同的文件名,則這不起作用) - 您可以使用一個
find
和-exec
- 然後使用發送一堆文件
scp
scp
複製資料夾結構不夠先進,並且沒有單一命令可以複製資料夾樹。
另外,如果您需要資料夾中的所有文件,因為您將無法透過通配符選擇它們,並且您想要保留資料夾結構 - 您可能需要使用mc
= Midnight Commander 及其「Shell 連結」。