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
所有搜尋結果。find
scp
{}
scp
將找到的檔案複製到本機或任何其他電腦。
這在我的測試設定中有效,因為我交換了公鑰以便在沒有密碼的情況下使用身份驗證。