如何使用Perl或shell非递归地迁移目录?

时间:2008-12-22 20:46:02

标签: perl shell directory

我们正在将主文件夹迁移到新的文件系统,我正在寻找一种使用Perl或shell脚本自动化它的方法。我在编程语言方面没有太多选择,因为系统是专有的存储集群,应尽可能保持不变。

任务:在目录/ home /下我有各种用户的主文件夹aaa,bbb,ccc,...他们有一些权限和用户/组所有权,在迁移到/ newhome /时需要保持不变。以下是需要从/ home迁移的示例:

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的新手,所以我需要帮助。

4 个答案:

答案 0 :(得分:8)

cp的-a标志将保留权限,修改时间等。您应该能够执行以下操作:

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

尝试使用一个目录,看看在自动化之前是否做了所需的事情。

编辑:您可以使用Paul提到的rsync或tar来禁用递归文件复制。使用rsync时,仍会保留子目录,但不会复制文件:

sudo rsync -pgodt /home/ /newhome/

我没有试过tar的--no-recursion,所以无法评论它。

编辑2:另一种方式

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

Reference

答案 1 :(得分:4)

如果您执行root复制操作,则只能保留所有者和组。所提供的大多数命令都可以使用 - tarcp -rp选项。

唯一需要担心的是不可写目录,但这对非root用户来说是一个问题。然后,我倾向于使用:

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

-depth选项意味着在目录本身之前处理文件和子目录,因此只有在将目录的所有内容复制到目录中之后才能设置目录的无写权限。您还可以使用“sort -r”以相反的顺序列出文件,以确保目录显示在其内容之后。

答案 2 :(得分:3)

这将创建目录复制所有文件。

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

如果您不想复制所有文件,可以通过在第一个tar命令中添加“--no-recursion”来实现。

答案 3 :(得分:1)

如果这些目录位于同一文件系统上,为什么不简单

cp -p /home/* /newhome/
相关问题