3

我们正在将主文件夹迁移到一个新的文件系统,我正在寻找一种使用 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

4 回答 4

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

参考

于 2008-12-22T20:49:46.803 回答
4

如果您将复制操作设置为 ,则只能保留所有者和组root。大多数给出的命令都可以工作 -tarcp -rp选项都可以。

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

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

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

于 2008-12-22T21:44:51.840 回答
3

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

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

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

于 2008-12-22T20:53:31.333 回答
1

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

cp -p /home/* /newhome/
于 2008-12-22T20:53:49.320 回答