Bash

使用 scp 從目錄中複製特定副檔名的文件

  • April 9, 2019

我正在編寫一個 bash 腳本,該腳本需要*_out.csv從遠端伺服器上的目錄中獲取所有內容。所有這些文件都是另一個目錄深處的幾個目錄。例如,假設目錄名為ox_20190404/. 我可以通過以下方式找到我的所有文件:

find ox_20190404/assessment/LWR/validation -type f -name "*_out.csv"

這個問題回答了我的部分問題,但由於我不想完整地複制目錄,我需要弄清楚如何實現上述程式碼。假設我從這個開始:

$ dir="/projects/ox/git"
$ server="myusername@server"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

我將如何從那裡獲取我需要的文件?

我的問題的最後一部分想知道是否有辦法獲取所有複製的文件並將它們放在遠端伺服器上的相同文件路徑和目錄中。

我已經稍微調整了一些變數名。

當然,有比解析 ls 的輸出這樣危險的方法更好的方法,但看看這是否適合你:

$ pth="/projects/ox/git"
$ server="myusername@server"
$ dir="$(ssh $server "ls -t \"$pth\" | head -1")"
$ mkdir -p "$pth/$dir"
$ scp -p $server:"$pth/$dir"/'*_out.csv' "$pth/$dir"/

一旦dir被設置為最新的遠端目錄,mkdir -p用於確保本地存在相同的目錄名。然後scp將文件放入與遠端目錄具有相同路徑和名稱的本地目錄。我一直在尋找 rsync 解決方案,但想不出一個。

這將找到最近修改(創建)的目錄,假設目錄名稱不包含換行符 ( \n)

newest=$(
   ssh -qn REMOTE 'find ./* -mindepth 0 -maxdepth 0 -type d -printf "%T@\t%f\n"' |
   sort -t$'\t' -r -nk1,2 |
   head -n1 |
   cut -f2-
)

如果您可以保證目標僅包含感興趣的目錄,則可以大大簡化它(同樣,請記住換行問題)

newest=$(ssh -qn REMOTE ls -t | head -n1)

您可以使用 複製整個文件樹scp,但如果您想過濾它,最好使用rsync

rsync -av --include '*/' --include '*_out.csv' --exclude '*' --prune-empty-dirs REMOTE:"$newest" "$newest"

如果您將前一組文件保存在本地,並且您真的只想添加最新組而不複製以前的文件,rsync也可以這樣做

rsync -av --include '*/' --include '*_out.csv' --exclude '*' --prune-empty-dirs REMOTE: .

引用自:https://unix.stackexchange.com/questions/510795