场景:使用普通用户运行的脚本,我想复制多个文件,并复制 dir 结构。例如:
cp --parents /lib/libacl.so /tmp/my_root/
cp --parents /lib/libc.so.6 /tmp/my_root/
预期结果:首先cp
,创建 /tmp/my_root/lib 并将 libacl.so 放入其中。第二个cp
将 libc.so.6 放入 /tmp/my_root/lib 中。
问题是,第一个cp
创建具有以下权限的 /tmp/my_root/lib :dr-xr-xr-x.
,因此第二个cp
失败,权限被拒绝。
当然,如果我以 root 身份运行脚本,一切都会正常。
一种解决方案可以是先创建目录,然后复制文件,这样目录将具有适当的权限,但我想知道是否有更好的方法来做到这一点,也许是一些标志cp
?我检查了那个人,但没有发现任何东西。
答案1
我看不到解决方案cp
。您可以用来rsync
执行相同类型的副本,它还会创建一个不可写的lib
目录,但它能够将新文件添加到该目录中。你的命令变成:
rsync -LR /lib/libacl.so /tmp/my_root/
rsync -LR /lib/libc.so.6 /tmp/my_root/
保留-R
目录结构。我添加了-L
符号链接,似乎就是这样cp
,尽管通常这不是我们想要的。您可以添加-a
以保留权限和时间戳(以及所有者/组,如果是 root)。
rsync 通常用于通过网络复制文件,但它是一个非常通用的命令。
如果您没有 rsync,则可以使用其他一些命令来复制文件,但创建一个可写的目录,是tar
和cpio
:
tar cf - /lib/libc.so.6 | tar -C /tmp/my_root/ -xf -
或者使用chf
跟踪链接。对于 cpio:
ls /lib/libc.so.6 | cpio -pd /tmp/my_root/
使用 -L 来跟踪链接。