scp 所有以「-123.jpg」結尾的檔案 - 遞歸、空格、通配符...

scp 所有以「-123.jpg」結尾的檔案 - 遞歸、空格、通配符...

對我來說,發生的事情太多了,我無法讓我的菜鳥腦袋在這裡閒晃。我想從遠端伺服器上的多個嵌套目錄下載所有以 -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

參考:https://community.hpe.com/t5/System-Administration/How-to-scp-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/true# M238959

答案4

正確地應該分兩部分完成:

  1. 首先找到所有需要的文件並將它們複製到一個資料夾(如果您具有相同的文件名,則這不起作用) - 您可以使用一個find-exec
  2. 然後使用發送一堆文件scp

scp複製資料夾結構不夠先進,並且沒有單一命令可以複製資料夾樹。

另外,如果您需要資料夾中的所有文件,因為您將無法透過通配符選擇它們,並且您想要保留資料夾結構 - 您可能需要使用mc= Midnight Commander 及其「Shell 連結」。

相關內容