[英]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.