【问题标题】:How can I non-recursively migrate directories with Perl or shell?如何使用 Perl 或 shell 非递归迁移目录?
【发布时间】:2010-09-28 02:08:04
【问题描述】:

我们正在将主文件夹迁移到一个新的文件系统,我正在寻找一种使用 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 很陌生,所以我需要帮助。

【问题讨论】:

    标签: perl shell directory


    【解决方案1】:

    cp's -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-liner,谢谢!有没有办法告诉cp不要复制每个用户目录的子文件夹和文件?换句话说,只在 /home 下创建顶级用户目录,而不复制内容。
    • @DV:手册页声明 cp -a 等同于 cp -dpr ...因为 -r 处理递归, cp -dp 应该做你想做的事而无需递归。
    • Adam, cp 如果未指定 -r 则省略目录,因此 -dp 仅适用于 AFAIK 文件。
    • codelogic 是对的,我无法让它像 'cp -dp' 一样工作 :( 似乎没有办法让 cp 只复制 /home 下面的顶部文件夹而不复制它们的所有内容... :/
    • @codelogic:明白了,我没有意识到 DV 想要创建顶级目录并将它们留空。我的错。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我会试试的。我正在寻找没有递归,谢谢你的提示!
    • 不幸的是,当我尝试它时它没有复制权限/所有权。也许我做的不对。
    • @DV:在tar之前添加sudo
    • @DV - 或以 root 身份执行。确保在第二个 tar 中包含该“p”,以复制权限。
    【解决方案3】:

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

    cp -p /home/* /newhome/
    

    【讨论】:

    • 我会试试的 - 我可以通过 NFS 挂载 /newhome/。谢谢!
    • 这样做了,但仍然存在递归(即它也会复制所有子目录和文件)。有没有办法告诉 cp 不要递归?
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      相关资源
      最近更新 更多