unix 将一个目录的内容复制到另一个目录的推荐方法[已关闭]

8aqjt8rx  于 2023-01-17  发布在  Unix
关注(0)|答案(1)|浏览(149)

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题有关,您可以留下评论,说明在何处可以回答此问题。
9小时前关门了。
Improve this question
要将一个目录的内容复制到另一个目录,我可以使用以下命令:

cp -Rip source-dir/ ../destination-dir/

但是,在使用cpmv命令时,在源目录末尾使用尾随斜杠似乎有点discouraged

源目录上没有尾随斜杠

不应在源目录上放置尾部斜杠:
这一点不仅与cp-**有关,而且与mv有关,在mv中,它更为重要
我将引用手册中的警告-请注意,它不在手册页中,而是在信息页info coreutils 'mv invocation'中:

    • 警告**:避免指定带有尾部斜杠的源名称,因为它可能是指向目录的符号链接。否则,'mv'可能会执行一些非常令人惊讶的操作,因为它的行为取决于底层的重命名系统调用。在具有基于Linux的现代内核的系统上,它会失败,并显示'errno = ENOTDIR'。但是,在其他系统上(至少是FreeBSD 6.1和Solaris 10),它不会自动重命名符号链接,而是重命名符号链接引用的目录。

真的是这样吗?如果答案是"是",那么推荐的复制目录内容的方法是什么?

fwzugrvs

fwzugrvs1#

我认为使用tar进行内容复制会更好。它会给予你更好的控制和灵活性来执行操作。有时简单就是太简单了。
为此,我提出以下建议,作为解决你所关心的问题的初始逻辑流程,然后你可以根据自己的需要进行调整。

#!/bin/bash

STRT=`pwd`
OldRootDIR="${STRT}/Something"
NewRootDIR="${STRT}/Dupl"

mkdir  "${NewRootDIR}"
ls -ld "${OldRootDIR}"
ls -ld "${NewRootDIR}"

option=""

while [ $# -gt 0 ]
do
    case $1 in
        --symlink_contents )    option="--dereference" ; shift ;;
        --symlinks_only )   option="" ; shift ;;
        * ) echo -e "\n\t Invalid parameter identified on command line.  Only allowed:  [ --symlink_contents | --symlinks_only ] \n Bye!\n" ; exit 1 ;;
    esac
done

if [ ! -d "${OldRootDIR}" ]
then
    echo -e "\n\t Directory '${OldRootDIR}' does not exist.  Unable to proceed.\n Bye!\n" ; exit 1
fi

if [ ! -d "${NewRootDIR}" ]
then
    echo -e "\n\t Directory '${NewRootDIR}' does not exist.  Unable to proceed.\n Bye!\n" ; exit 1
fi

( cd "${OldRootDIR}" ; tar cf - --one-file-system ${option} . ) | ( cd "${NewRootDIR}" ; tar xvpf - )

相关问题