无法在 linux 中以原始大小复制共享库的软链接
Unable to copy the shared library's soft links with their original size in linux
我创建了一个1.2M的共享对象,并为那个SO创建了4个软链接。
所有链接的大小为 20B,主链接的大小为 1.2M
20 May 23 10:56 libAbc.so -> libAbc.so.2.0.11.0
20 May 23 10:56 libAbc.so.1 -> libAbc.so.2.0.11.0
20 May 23 10:56 libAbc.so.1.0 -> libAbc.so.2.0.11.0
1.2M May 23 10:56 libAbc.so.2.0.11.0
虽然我尝试使用 cp 将所有这些文件复制到另一个文件夹,但链接的大小等于主文件。
1.2M May 24 08:07 libABC.so
1.2M May 24 08:07 libABC.so.1
1.2M May 24 08:07 libABC.so.1.0
1.2M May 24 08:07 libABC.so.2.0.11.0
我也用过
cp -s libAgent.so* src/
这也因错误而失败
cp: `src/libAgent.so': can make relative symbolic links only in current directory
为什么无法复制原始大小 (20B) 的软链接
复制软件 link 通常复制软件 link 引用的文件,而不复制软件 link.
如果您希望使用 cp
将软件 link 复制为新的软件 link,请指定 -a 选项以cp
.
cp -a libAbc.so* /path/to/another/folder
cp
的信息 页面说:
`-a'
`--archive'
Preserve as much as possible of the structure and attributes of the
original files in the copy (but do not attempt to preserve internal
directory structure; i.e., `ls -U' may list the entries in a copied
directory in a different order). Equivalent to `-dpR'.
关键是select命令的"archive"选项用来复制link。 rsync
是一个有效的替代方案,正如 Maxim Egorushkin 指出的那样,如果命令包含适当的命令行参数,rsync
具有复制扩展属性和 ACL 的能力。
rsync -aAX libAbc.so* /path/to/another/folder
rsync
手册页说:
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
-A, --acls preserve ACLs (implies -p)
-X, --xattrs preserve extended attributes
在 OP 的用例中,不需要 -A 和 -X。
需要注意的是,如果软 link 是相对路径 link,将其复制到新位置可能会使 link 失效,因为它没有指向绝对路径.
例如:
$ ls -al /usr/lib/rpmpopt
lrwxrwxrwx 1 root root 19 2012-05-02 12:40 /usr/lib/rpmpopt -> rpm/rpmpopt-4.4.2.3
cp -a /usr/lib/rpmpopt ${HOME}/tmp
和 rsync -av /usr/lib/rpmpopt ${HOME}/tmp
在我的机器上都创建了一个损坏的 link rpmpopt -> rpm/rpmpopt-4.4.2.3
因为我的本地副本没有 rpm子文件夹。在决定复制什么时需要考虑这一事实。
此 link 已损坏,因为 ${HOME}/tmp/rpm 不存在:
$ ls -nl ${HOME}/tmp/rpmpopt
lrwxrwxrwx 1 505 700 19 2016-05-24 10:04 /home/kbulgrien/tmp/rpmpopt -> rpm/rpmpopt-4.4.2.3
rsync
比 cp
:
更不容易出错
rsync -av libAgent.so* src/
我创建了一个1.2M的共享对象,并为那个SO创建了4个软链接。 所有链接的大小为 20B,主链接的大小为 1.2M
20 May 23 10:56 libAbc.so -> libAbc.so.2.0.11.0
20 May 23 10:56 libAbc.so.1 -> libAbc.so.2.0.11.0
20 May 23 10:56 libAbc.so.1.0 -> libAbc.so.2.0.11.0
1.2M May 23 10:56 libAbc.so.2.0.11.0
虽然我尝试使用 cp 将所有这些文件复制到另一个文件夹,但链接的大小等于主文件。
1.2M May 24 08:07 libABC.so
1.2M May 24 08:07 libABC.so.1
1.2M May 24 08:07 libABC.so.1.0
1.2M May 24 08:07 libABC.so.2.0.11.0
我也用过
cp -s libAgent.so* src/
这也因错误而失败
cp: `src/libAgent.so': can make relative symbolic links only in current directory
为什么无法复制原始大小 (20B) 的软链接
复制软件 link 通常复制软件 link 引用的文件,而不复制软件 link.
如果您希望使用 cp
将软件 link 复制为新的软件 link,请指定 -a 选项以cp
.
cp -a libAbc.so* /path/to/another/folder
cp
的信息 页面说:
`-a'
`--archive'
Preserve as much as possible of the structure and attributes of the
original files in the copy (but do not attempt to preserve internal
directory structure; i.e., `ls -U' may list the entries in a copied
directory in a different order). Equivalent to `-dpR'.
关键是select命令的"archive"选项用来复制link。 rsync
是一个有效的替代方案,正如 Maxim Egorushkin 指出的那样,如果命令包含适当的命令行参数,rsync
具有复制扩展属性和 ACL 的能力。
rsync -aAX libAbc.so* /path/to/another/folder
rsync
手册页说:
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
-A, --acls preserve ACLs (implies -p)
-X, --xattrs preserve extended attributes
在 OP 的用例中,不需要 -A 和 -X。
需要注意的是,如果软 link 是相对路径 link,将其复制到新位置可能会使 link 失效,因为它没有指向绝对路径.
例如:
$ ls -al /usr/lib/rpmpopt
lrwxrwxrwx 1 root root 19 2012-05-02 12:40 /usr/lib/rpmpopt -> rpm/rpmpopt-4.4.2.3
cp -a /usr/lib/rpmpopt ${HOME}/tmp
和 rsync -av /usr/lib/rpmpopt ${HOME}/tmp
在我的机器上都创建了一个损坏的 link rpmpopt -> rpm/rpmpopt-4.4.2.3
因为我的本地副本没有 rpm子文件夹。在决定复制什么时需要考虑这一事实。
此 link 已损坏,因为 ${HOME}/tmp/rpm 不存在:
$ ls -nl ${HOME}/tmp/rpmpopt
lrwxrwxrwx 1 505 700 19 2016-05-24 10:04 /home/kbulgrien/tmp/rpmpopt -> rpm/rpmpopt-4.4.2.3
rsync
比 cp
:
rsync -av libAgent.so* src/