$ cp --no-preserve=mode --parents /sys/power/state /tmp/test/
$ cp --no-preserve=mode --parents /sys/bus/cpu/drivers_autoprobe /tmp/test/
两行中的第二行将失败
cp: cannot make directory ‘/tmp/test/sys/bus’: Permission denied
原因是它/tmp/test/sys
是在没有写权限的情况下创建的(与原始的一样/sys
);正常人mkdir /tmp/test/sys2
不会这样做:
$ ls -la /tmp/test/
total 32
drwxr-xr-x 3 robert.siemer domain^users 4096 Oct 11 13:56 .
drwxrwxrwt 13 root root 20480 Oct 11 13:56 ..
dr-xr-xr-x 3 robert.siemer domain^users 4096 Oct 11 13:56 sys
drwxr-xr-x 2 robert.siemer domain^users 4096 Oct 11 13:59 sys2
我怎样才能指示cp
不保留模式,除了--no-preserve=mode
,它不能像我认为的那样工作......?
或者我应该使用哪个工具来复制文件列表而不保留除符号链接之外的“任何内容”?
答案1
如果您使用的是 GNU coreutils。这是一个错误,已在 8.26 版本中修复。
https://lists.gnu.org/archive/html/bug-coreutils/2016-08/msg00016.html
所以替代工具是最新的 coreutils,或者例如rsync
即使保留权限也可以做到这一点:
$ rsync -a --relative /sys/power/state /tmp/test
$ rsync -a --relative /sys/bus/cpu/drivers_autoprobe /tmp/test/
虽然我发现 rsync 对于这个特定的 sysfs 文件还有其他问题,请参阅 rsync 选项禁用验证?
另一个严厉的解决方法是chmod
在每个命令之后对所有目录进行操作cp
。
$ find /tmp/test -type d -exec chmod $(umask -S) {} \;
(上面的 find/chmod 命令也不适用于任何现有权限和 umask 的组合。)
顺便提一句您可以向您的 Linux 发行版报告此错误,他们可能会通过维护更新修复您的 8.21 软件包。
答案2
该错误的简单解决方法
#!/bin/sh
for last; do : ; done
while [ $# -gt 1 ]; do
mkdir -p "${last}/$(dirname "$1")"
cp --parents "$1" "$last"
shift
done