파일을 덮어쓰면 셸을 호출하지 않고도 대상 권한이 유지됩니다.

파일을 덮어쓰면 셸을 호출하지 않고도 대상 권한이 유지됩니다.

이런 상황이 있어요

$ ls -la
-rw-r--r-- 1 user user 123 Mar  5 19:32 file-a
-rwx---rwx 1 user user 987 Mar  5 19:32 file-b

file-boverride 를 사용하고 싶지만 file-a모든 권한과 소유권은 유지하고 싶습니다 file-b.

권한을 사용하기 때문에 작동하지 않습니다.file-a

cp file-a file-b # << edit: this works as expected! My fault!
mv file-a file-b

이는 작동하지만 셸에서만 호출할 수 있습니다. 함수나 그와 유사한 것만 호출할 수 있는 상황을 상상해 보십시오 execve.

cat file-a > file-b

나도 알아요, 나도 다음과 같은 일을 할 수 있어요

sh -c "cat file-a > file-b"

그러나 이로 인해 파일 이름을 이스케이프하는 데 어려움이 있으므로 사용하고 싶지 않습니다.

이 작업을 수행하기 위한 몇 가지 일반적인 명령이 있습니까? 아니면 이 작업을 수행하기 위해 자체 도우미 C 프로그램을 작성해야 합니까?

답변1

패턴을 복사하지 않고 파일을 복사하는 간단한 명령은 다음과 같습니다.

dd if=file-a of=file-b

dd그러나 stderr에 자세한 상태 메시지가 기록 됩니다 . 셸에서 명령을 실행하고 를 추가하여 이를 억제할 수 있지만 2> /dev/null그런 다음 1단계로 돌아갑니다. GNU가 있다면 dd이것을 할 수 있습니다

dd if=file-a of=file-b status=none

답변2

rsync --inplace file-a file-b당신이 원하는 것을해야합니다.

https://linux.die.net/man/1/rsync

--inplace 이 옵션은 데이터를 업데이트해야 할 때 rsync가 파일을 전송하는 방식을 변경합니다. 파일의 새 복사본을 생성하고 완료되면 해당 위치로 이동하는 기본 방법 대신 rsync는 업데이트된 데이터를 대상에 직접 씁니다. 파일.

답변3

man cp설명하다:

기존의 각 대상 파일에 대해 권한이 허용되면 해당 내용을 덮어씁니다. -p이 옵션을 지정 하지 않으면 해당 모드, 사용자 ID, 그룹 ID는 변경되지 않습니다.

이것을 설정하면 -p소스 cp파일의 소유권과 액세스 권한을 보존하려고 시도하지만 기본 동작은 가능할 때마다 대상 파일의 이러한 속성을 보존하는 것입니다.

무슨 뜻이야?"가능하다면"?

물론 대상 파일이 존재하지 않으면 이는 불가능합니다. 이 경우 cp기본 소유권(현재 사용자 및 현재 사용자의 기본 그룹)과 기본 권한( 참조 man 2 umask)을 사용하여 파일이 생성됩니다. -p자체적으로 동작을 복원 하지는 않습니다 .

또한 현재 사용자가 쓰기 위해 대상을 열 수 없는 경우 cp이 방법은 작동하지 않습니다 . 이 경우 cp실패하거나 하나를 지정하면 -f기존 파일 삭제로 대체되어(따라서 해당 디렉터리에 대한 쓰기 권한만 필요함) 첫 번째 사례를 다시 적용합니다.

mv이것이 귀하의 계층에서 작동하지 않는 이유는 항상 mv()를 사용하여 파일을 원자적으로 먼저 이동하려고 시도하기 때문입니다. 이는 대상이 존재하지 않고 소스와 대상이 동일한 저장소 엔터티에 있는 경우에만 작동합니다(일반적으로 이는 같은 분할). 장점은 문자 그대로 단일 원자 작업으로 처리되어 모든 소유권과 파일 권한을 유지하면서 파일을 한 위치에서 사라지고 다른 위치에 다시 나타나게 한다는 것입니다. 이것이 가능하지 않은 경우 다음과 함께 작동한다고 문서화되어 있습니다.renameman 2 renamerenamemv

rm -f destination_path && \
cp -pRP source_file destination && \
rm -rf source_file

관련 정보