簡體   English   中英

如何使用FIND遞歸備份多個Subversion存儲庫

[英]How can I use FIND to recursively backup multiple subversion repositories

目前,我們的備份腳本每天晚上在每個存儲庫上明確運行svnadmin hotcopy。 我們的存儲庫都存儲在父目錄(/ usr / local / svn / repos)下。備份腳本在該目錄下的每個存儲庫都有一行,分別是:svnadmin hotcopy / usr / local / svn / repos / myrepo1 / usr /本地/備份/ myrepo1

我希望不必為每個聯機的新倉庫手動添加新行,而是希望使用find命令對在/ usr / local / svn / repos下找到的每個目錄運行svnadmin hotcopy。

到目前為止,我已經:

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \;

,為簡單起見,在這里用“ echo”替換“ svnadmin hotcopy”。 輸出為:

/usr/local/backup/usr/local/svn/repos/ure
/usr/local/backup/usr/local/svn/repos/cheetah
/usr/local/backup/usr/local/svn/repos/casemgt
/usr/local/backup/usr/local/svn/repos/royalliver
/usr/local/backup/usr/local/svn/repos/ure_andras
/usr/local/backup/usr/local/svn/repos/profserv
/usr/local/backup/usr/local/svn/repos/frontoffice
/usr/local/backup/usr/local/svn/repos/ure.orig
/usr/local/backup/usr/local/svn/repos/projectcommon
/usr/local/backup/usr/local/svn/repos/playground
/usr/local/backup/usr/local/svn/repos/casegen

問題是完整路徑包含在{}中。 我只需要傳遞給-exec的目錄名的最后一個元素

我想要的輸出是:

/usr/local/backup/ure
/usr/local/backup/cheetah
/usr/local/backup/casemgt
/usr/local/backup/royalliver
/usr/local/backup/ure_andras
/usr/local/backup/profserv
/usr/local/backup/frontoffice
/usr/local/backup/ure.orig
/usr/local/backup/projectcommon
/usr/local/backup/playground
/usr/local/backup/casegen

在這一點上,我幾乎陷入了困境。 有人可以幫我從這里出去嗎? 預先感謝,戴夫

您在正確的軌道上。 嘗試這個:

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -printf "%f\0" | xargs -0 -I{} echo svnadmin hotcopy /usr/local/svn/repos/\{\} /usr/local/backup/\{\}

%f類似於basename並且xargs上的null加上-0可確保成功傳遞帶有空格等的名稱。

只需刪除echo並進行您可能需要的任何調整,它就可以解決問題。

在最后放置剪切命令

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"

如何添加一個sed過濾器來切除中間部分?

sed 's/usr.local.svn.repos.//g'

像這樣添加

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} ";" | sed 's/usr.local.svn.repos.//g'
ls -al /usr/local/svn/repos/ |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo /usr/local/svn/repos/zzyggy

它有點長,但是可以解決問題。 當還有許多其他Shell命令時,您不必對find進行任何操作,盡管如果我必須編寫此類腳本,則可以使用Python進行編寫,而將Shell留作交互式工作。

ls -al列出具有屬性的命名目錄中的所有文件

grep '^d'選擇以d開頭的目錄行

sed刪除實際目錄名稱左側的所有字符。 您可能需要添加或刪除一些點

xargs獲取目錄名稱列表,並一次發布一次。 我指定了zzyggy作為要在執行的命令中替換的名稱,但是您可以選擇自己喜歡的名稱。 當然,您可以使用svnadmin命令替換echo。

如果是在shell腳本中,則應該這樣做

SVNDIRNAME="/usr/local/svn/repos"
ls -al $SVNDIRNAME |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo $SVNDIRNAME/zzyggy

但是我決定以錯誤和正確的方式來解釋這一點。 我將使用一些shell標記對其進行標記,但是我仍然認為Python腳本是解決21世紀這種問題的一種更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM