使用scp取得多個目錄下的所有文件

使用scp取得多個目錄下的所有文件

A1/B1/C1/files111*我有一個看起來像、A1/B1/C2/files112*A1/B2/C1/files121*、等的目錄結構,A1/B2/C2/files122*因此所有目錄中的所有檔案都是唯一的。有沒有辦法使用 scp (或其他一些工具)files###*一次提取所有終端檔案?

答案1

由於您沒有在問題中指定這一點,我將假設目錄結構是遠端的,並且您希望它是本地的。

您需要做的是使用通配符,但在客戶端轉義它們,以便本地 shell 忽略它們並傳遞它們。將其與遞歸標誌 ( -r) 結合起來,它應該按照您想要的方式執行:

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

重要的部分是反斜杠,因為這會使本地 shell 忽略星號,而是將其傳遞。這應該允許您從遠端提取所有內容files*,包括子目錄。它還將提取名稱以files*.

答案2

首先,您必須考慮您希望以這種方式複製的文件發生什麼,以及它可能如何影響將來的複製操作。他們會留在那裡嗎?它們會被刪除嗎?已存檔?一旦您了解了這一點,您就可以建立複製命令,然後進行必要的清理操作。下面是一個範例腳本,它首先複製所有現有文件,然後從遠端伺服器中刪除它們。

檔案在複製和刪除操作之間可能會發生更改,因此我首先將它們移至臨時目錄,然後從那裡複製並刪除它們,從而允許工作目錄繼續常規操作。

我還會創建一個 cron 作業來每天同一時間自動檢索這些文件,並添加一些健全性檢查以確保操作成功完成。

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done

答案3

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • ssh連接到遠端電腦並執行雙引號括起來的程式碼""
  • find在目錄內部搜尋/target/A1包含關鍵字「files」的所有檔案。請注意,您需要使用反斜線來表示不區分大小寫的搜尋參數-iname和雙引號,以避免過早離開前一對。
  • -exec是另一個find參數,用於執行程式碼。在我們的例子中,我們使用彎括號執行並傳遞scp所有搜尋結果。findscp{}
  • scp將找到的檔案複製到本機或任何其他電腦。

這在我的測試設定中有效,因為我交換了公鑰以便在沒有密碼的情況下使用身份驗證。

相關內容