2008-12-22 56 views
3

我們正在將主文件夾遷移到新的文件系統,我正在尋找一種使用Perl或shell腳本來自動化它的方法。我沒有太多的編程語言選擇,因爲系統是專有存儲集羣,應儘可能保持不變。如何用Perl或shell非遞歸地遷移目錄?

任務:在目錄下/ home /我有各種用戶的主文件夾aaa,bbb,ccc,...並且它們具有某些權限和用戶/組的所有權,在遷移到/ newhome /時需要保持原樣。這裏的例子,需要從/家庭遷移的內容:

drwxr-xr-x 3 aaaaa xxxxxxxxx 4096 Feb 26 2008 aaaaa/ 
drwxrwxrwx 88 bbbbbbb yyyyyy  8192 Dec 16 16:32 bbbbbbb/ 
drwxr-xr-x 6 ccccc yyyyyy  4096 Nov 24 04:38 ccccc/ 
drwxr-xrwx 36 dddddd yyyyyy  4096 Jun 20 2008 dddddd/ 
drwxr-xr-x 27 eee  yyyyyy  4096 Dec 16 02:56 eee/ 

因此,處理權限和所有權完全相同的文件夾應該在/ newhome上創建的。複製/移動文件不應該成爲問題,因爲它將在稍後處理。

任何人都曾在這樣的腳本?我對Perl真的很陌生,所以我需要幫助。

回答

8

cp的-a標誌將保持權限,修改時間等,你應該能夠做到像:

for a in `ls /home`; do cp -a "/home/$a" "/newhome/$a" ; done 

一個目錄試試吧,看是否確實自動化之前,你需要什麼。

編輯:你可以通過使用rsync或tar來保護遞歸文件的複製。隨着rsync的,子目錄仍然保留,但文件不會被複制:

sudo rsync -pgodt /home/ /newhome/ 

我還沒有嘗試過焦油的--no遞歸,所以不能對此發表評論。

編輯2:另一種方式

find /home/ -maxdepth 1 -print | sudo cpio -pamVd /newhome 

Reference

+0

很棒的1班輪,謝謝!有沒有辦法告訴cp不要複製每個用戶目錄的子文件夾和文件?換句話說,只需在/ home下創建頂級用戶目錄而不需要複製內容。 – 2008-12-22 21:03:09

+0

@DV:手冊頁狀態cp -a等同於cp -dpr ...因爲-r處理遞歸,所以cp -dp應該做你想要的而不遞歸的。 – 2008-12-22 21:29:06

+0

Adam,如果未指定-r,cp會省略目錄,因此-dp只適用於AFAIK文件。 – codelogic 2008-12-22 21:31:06

3

這將創建目錄複製所有文件。

cd /home; tar cvBf - . | (cd /newhome; tar xvpBf -) 

如果您不想複製所有的文件,你也許可以通過添加一個「--no遞歸」到第一個tar命令做。

1

如果這些目錄在同一文件系統,爲什麼不乾脆

cp -p /home/* /newhome/ 
4

你只能如果你複製操作root保存所有者和組。大部分命令都可以使用 - tarcp -rp選項將會起作用。

唯一要擔心的技巧是不可寫目錄,但這對於非root用戶來說是一個問題。然後,我傾向於使用:

(cd /home; find . -depth) | cpio -pvdumB /newhome 

-depth選項意味着文件和子目錄的目錄之前處理自己,所以在目錄上沒有寫權限的目錄中的所有內容後,只設置已被複制到它。您還可以使用'sort -r'按相反順序列出文件,這可確保目錄顯示在其內容之後。