$ 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
は私の考えのように動作しません...?
または、シンボリックリンク以外の「何も」維持せずにファイルリストをコピーするには、どのツールを使用する必要がありますか?
答え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/
この特定のsysfsファイルにrsyncに関連する他の問題があることがわかりましたが、以下を参照してください。 検証を無効にするrsyncオプションはありますか?
もう1つの大胆な回避策は、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