Permissions

為什麼 cp –no-preserve=mode 保留模式?可用的替代工具?

  • July 25, 2017
$ 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我認為它應該不起作用的模式……?

或者我應該使用哪個工具來複製文件列表而不保留符號連結以外的“任何東西”?

如果您使用的是 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 軟體包。

引用自:https://unix.stackexchange.com/questions/315663