$ 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/
이 특정 sysfs 파일에 대한 rsync와 관련된 다른 문제가 있음을 발견했지만 다음을 참조하세요. 유효성 검사를 비활성화하는 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