web-dev-qa-db-ja.com

cp --no-preserve = modeがモードを保持するのはなぜですか?利用可能な代替ツール?

$ cp --no-preserve=mode --parents /sys/power/state /tmp/test/
$ cp --no-preserve=mode --parents /sys/bus/cpu/drivers_autoprobe /tmp/test/

2行のうち2行目は失敗します

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以外のモードを保存しないように指示するにはどうすればよいですか。

または、シンボリックリンク以外の「何も」を保存せずにファイルのリストをコピーするには、どのツールを使用すればよいですか?

6
Robert Siemer

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のanyの組み合わせに対しても機能しません。)

[〜#〜] btw [〜#〜]このバグをLinuxディストリビューションに報告すると、メンテナンスアップデートによって8.21パッケージが修正される可能性があります。

14
rudimeier