Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中,复制文件的最佳方式是什么?如果是符号链接,还可以复制链接到的文件?_Linux_Bash_Symlink - Fatal编程技术网

Linux 在bash中,复制文件的最佳方式是什么?如果是符号链接,还可以复制链接到的文件?

Linux 在bash中,复制文件的最佳方式是什么?如果是符号链接,还可以复制链接到的文件?,linux,bash,symlink,Linux,Bash,Symlink,所以我知道我可以使用if[[-L”/home/user/link];然后…检查我的文件是否是符号链接,然后后跟类似于cp$(realpath)/home/user/link”)/home/new/location的内容。但我想知道是否有一个技巧可以自动执行此操作,比如说,cp或rsync,这样它总是复制链接和链接到文件的链接或者手工编写是唯一的方法——如果是这样,没关系,我可以自己编写函数。我什么也没发现,但我怀疑可能有什么聪明的把戏可以做到这一点——可能是错的:哦 实际上,这里是我的用例示例:

所以我知道我可以使用
if[[-L”/home/user/link];然后…
检查我的文件是否是符号链接,然后后跟类似于
cp$(realpath)/home/user/link”)/home/new/location的内容。但我想知道是否有一个技巧可以自动执行此操作,比如说,
cp
rsync
,这样它总是复制链接和链接到文件的链接或者手工编写是唯一的方法——如果是这样,没关系,我可以自己编写函数。我什么也没发现,但我怀疑可能有什么聪明的把戏可以做到这一点——可能是错的:哦

实际上,这里是我的用例示例:

libtest.so
libtestd.so -> libtest.so
libtest.so.1 -> libtest.so
libtestd.so.1 -> libtest.so.1
其中
d
后缀为debug。在这种情况下,调试和发布是同一个文件,因此当我进行发布构建时,我会得到正确的真实文件。当我进行调试构建时,我只得到符号链接,但我还想得到链接到的文件

我真的不想总是使用rsync的follow the link,因为这个规则还有其他例外,我最终会得到重复的so.1文件。。。因此,如果我想复制调试文件,我希望最终得到所有文件,但是如果我复制以发布,那么我只会得到
libtest.So
libtest.So.1
(链接)

例如,给定上述文件,如果我想要文件
libtestd.so
,那么我的函数将获取
libtestd.so
,并生成自身(作为链接)和链接到的文件

因此:

cpy\u func/dir\u source/libtest.so/dir\u dest

将从以下位置获取符号链接
libtestd.so

/dir_source/libtest.so
/dir_source/libtestd.so -> libtest.so
/dir_source/libtest.so.1 -> libtest.so
/dir_source/libtestd.so.1 -> libtest.so.1
并将其复制到dest文件夹,如下所示:

/dir_dest/libtest.so
/dir_dest/libtestd.so -> libtest.so

i、 e.它复制符号链接和符号链接指向的文件

我不认为下面的内容是最简单或最优雅的,但它在我的测试中起作用

我的测试设置

a/source
a/link1 -> source
a/link2 -> source
b/
c/
目录
b
c
中没有文件。 下面的代码允许您执行以下操作:

  • /cpy_函数a/源b
    结果:

    由于第一个参数是一个文件,它将文件和指向该文件的所有软链接复制到目标目录
    b

  • /cpy_func a/link2 c
    结果:

    由于第一个参数是软链接,它将链接及其指向的文件复制到目标目录
    c

cpy_func
的代码:

#! /bin/bash
#
###############################################################################

# Verify arguments
if [[ $# -ne 2 ]]
then
    echo "Usage: cpy_func <SRC> <DEST.DIR>"
    echo "       SRC: source file or source soft link"
    exit 1
else
    src="$1"
    src_file=$(basename "$src")
    src_dir=$(dirname "$src")
    dest_dir="$2"
fi

# Verify destination directory
if [[ ! -d "$dest_dir" ]]
then
    echo "ERROR: Directory $dest_dir does not exist."
    exit 2
fi

# Verify source existence (not type specific for now)
if [[ ! -e "$src" ]]
then
    echo "ERROR: $src does not exist."
    exit 3
fi

# Process a softlink
if [[ -L "$src" ]]
then
    echo "INFO: copying soft link $src and the target file..."
    # copy the file
    cp -v "$(readlink -f "$src")" "$dest_dir"
    # copy the link
    cp -vd "$src" "$dest_dir"
    exit 0
fi

# Process a file
if [[ -f "$src" ]]
then
    echo "INFO: copying file $src and its soft links..."
    # copy the file itself
    cp -v "$src" "$dest_dir"
    # copy softlinks
    while IFS= read -r -d $'\0' link
    do
        src_link=$(basename "$link")
        # Recreate the link in the destination directory
        ln -vs "$src_file" "$dest_dir/$src_link"
    done < <(find "$src_dir" -lname "$src_file" -print0)
    exit 0
fi

# If we got here, then $src is neither a softlink nor a file, exit!
echo "INFO: $src is neither a softlink, nor a file.  Nothing to do."
exit 0
#/bin/bash
#
###############################################################################
#验证参数
如果[$#-ne 2]]
然后
echo“用法:cpy_func”
echo“SRC:源文件或源软链接”
出口1
其他的
src=“$1”
src_文件=$(basename“$src”)
src_dir=$(dirname“$src”)
dest_dir=“$2”
fi
#验证目标目录
如果[!-d“$dest_dir”]]
然后
echo“错误:目录$dest_dir不存在。”
出口2
fi
#验证源是否存在(暂时不特定于类型)
如果[!-e“$src”]]
然后
echo“错误:$src不存在。”
出口3
fi
#处理软链接
如果[-L“$src”]]
然后
echo“信息:复制软链接$src和目标文件…”
#复制文件
cp-v“$(readlink-f“$src”)“$dest\u dir”
#复制链接
cp-vd“$src”“$dest_dir”
出口0
fi
#处理文件
如果[-f“$src”]]
然后
echo“信息:正在复制文件$src及其软链接…”
#复制文件本身
cp-v“$src”“$dest_dir”
#复制软链接
而IFS=read-r-d$'\0'链接
做
src_link=$(basename“$link”)
#在目标目录中重新创建链接
ln-vs“$src_文件”$dest_dir/$src_链接”

我不假装下面的内容是最简单或最优雅的,但它在我的测试中起作用

我的测试设置

a/source
a/link1 -> source
a/link2 -> source
b/
c/
目录
b
c
中没有文件。 下面的代码允许您执行以下操作:

  • /cpy_函数a/源b
    结果:

    由于第一个参数是一个文件,它将文件和指向该文件的所有软链接复制到目标目录
    b

  • /cpy_func a/link2 c
    结果:

    由于第一个参数是软链接,它将链接及其指向的文件复制到目标目录
    c

cpy_func
的代码:

#! /bin/bash
#
###############################################################################

# Verify arguments
if [[ $# -ne 2 ]]
then
    echo "Usage: cpy_func <SRC> <DEST.DIR>"
    echo "       SRC: source file or source soft link"
    exit 1
else
    src="$1"
    src_file=$(basename "$src")
    src_dir=$(dirname "$src")
    dest_dir="$2"
fi

# Verify destination directory
if [[ ! -d "$dest_dir" ]]
then
    echo "ERROR: Directory $dest_dir does not exist."
    exit 2
fi

# Verify source existence (not type specific for now)
if [[ ! -e "$src" ]]
then
    echo "ERROR: $src does not exist."
    exit 3
fi

# Process a softlink
if [[ -L "$src" ]]
then
    echo "INFO: copying soft link $src and the target file..."
    # copy the file
    cp -v "$(readlink -f "$src")" "$dest_dir"
    # copy the link
    cp -vd "$src" "$dest_dir"
    exit 0
fi

# Process a file
if [[ -f "$src" ]]
then
    echo "INFO: copying file $src and its soft links..."
    # copy the file itself
    cp -v "$src" "$dest_dir"
    # copy softlinks
    while IFS= read -r -d $'\0' link
    do
        src_link=$(basename "$link")
        # Recreate the link in the destination directory
        ln -vs "$src_file" "$dest_dir/$src_link"
    done < <(find "$src_dir" -lname "$src_file" -print0)
    exit 0
fi

# If we got here, then $src is neither a softlink nor a file, exit!
echo "INFO: $src is neither a softlink, nor a file.  Nothing to do."
exit 0
#/bin/bash
#
###############################################################################
#验证参数
如果[$#-ne 2]]
然后
echo“用法:cpy_func”
echo“SRC:源文件或源软链接”
出口1
其他的
src=“$1”
src_文件=$(basename“$src”)
src_dir=$(dirname“$src”)
dest_dir=“$2”
fi
#验证目标目录
如果[!-d“$dest_dir”]]
然后
echo“错误:目录$dest_dir不存在。”
出口2
fi
#验证源是否存在(暂时不特定于类型)
如果[!-e“$src”]]
然后
echo“错误:$src不存在。”
出口3
fi
#处理软链接
如果[-L“$src”]]
然后
echo“信息:复制软链接$src和目标文件…”
#复制文件
cp-v“$(readlink-f“$src”)“$dest\u dir”
#复制链接
cp-vd“$src”“$dest_dir”
出口0
fi
#处理文件
如果[-f“$src”]]
然后
echo“信息:正在复制文件$src及其软链接…”
#复制文件本身
cp-v“$src”“$dest_dir”
#复制软链接
而IFS=read-r-d$'\0'链接
做
src_link=$(basename“$link”)
#在目标目录中重新创建链接
ln-vs“$src_文件”$dest_dir/$src_链接”

done<--preserve=链接应该这样做吗?包括一个,不清楚您在这里问什么。@RamanSailopal否,我以前是这样做的,但这只是意味着符号链接变成了一个非符号链接的链接到文件的副本,带有符号链接文件的名称。。。我将添加一个更精确的示例来说明我想要的…@oguzismail我知道一些最小的示例,但在这种情况下我不能真正编写一个,因为我的示例只是我想要的文件