하나의 원자적 작업으로 파일을 이동하고 소유자와 모드를 유지합니다.

하나의 원자적 작업으로 파일을 이동하고 소유자와 모드를 유지합니다.

한 번의 원자성 작업으로 파일을 이동하고 원래 소유자(그룹) 및 파일 모드를 보존하는 방법이 있습니까? 그렇다면 원래 소유자나 스키마를 설정하지 않고도 다른 사람이 이동된 파일에 적시에 액세스할 수 있지 않을까요?

파일 시스템은 XFS입니다.

답변1

동일한 파일 시스템을 사용하여 파일을 이동하는 경우 이는 mv원자적 작업입니다.. 어느 정도 파일은 이전 위치에 있습니다. 그 이후에는 파일이 새 위치에 있게 됩니다. 이전 디렉터리의 파일 항목을 삭제하고 새 디렉터리에 새 항목을 추가하는 데는 한 번의 작업만 필요합니다. 항목은 파일 내용뿐만 아니라 전체 파일입니다.인덱스 노드, 소유자 및 권한과 같은 파일 메타데이터를 포함합니다. 권한은 언제든지 수정할 수 없습니다.

파일을 다른 파일 시스템으로 이동하려는 경우, 그러면 작업은 원자적이지 않습니다. 즉, 새 파일을 만든 다음 이전 파일과 일치할 때까지 해당 내용과 메타데이터를 수정하고 이전 파일을 삭제하는 작업이 포함됩니다. 생성된 새 파일은 항상 비어 있으며 해당 파일을 생성한 사용자에게 속합니다. 작성자는 파일이 생성된 후 즉시 기존 Unix 권한을 설정할 수 있지만 액세스 제어 목록은 설정할 수 없습니다.

mvumask필수 소유자 및 그룹으로 실행하고 파일 권한 보완을 설정하여 새 파일의 초기 소유자, 그룹 및 모드를 제어할 수 있습니다 . 다음은 사용자와 그룹이 존재하고 Bourne 스타일 쉘을 로그인 쉘로 사용한다고 가정하는 Linux 쉘 접근 방식입니다.

set $(stat -c '%U %G %a' "$original_file")
export user=$1 group=$2 mode=0$3 original_file destination
su "$user" -c 'sg "$group" -c "umask $((07777 & ~mode)) && touch "$destination" && mv -- "$original_file" "$destination"'

이는 매우 지루하며 올바른 소유권과 권한을 가지지만 내용, 타임스탬프 등이 다른 파일을 생성하게 됩니다. 파일이 완전히 복사될 때까지 표시되지 않도록 하려면 먼저 루트에만 표시되는 대상 파일 시스템의 임시 디렉터리로 파일을 이동한 다음 파일을 원자적으로 해당 위치로 이동합니다.

d=$(TMPDIR="$(dirname -- "${destination}")" mktemp -d)
chmod 700 "$d"
mv -- "$original" "$d/file"
mv -- "$d/file" "$destination"
rmdir d

답변2

현재 요구 사항은 mv동일한 파일 시스템 내의 파일 또는 파일 트리에서 작동하는 것입니다.

이는 원자성 및 소유권/그룹 요구 사항을 충족합니다. 작업이 사용자로 수행되는 경우 rootsetgid 및 고정 비트 플래그도 유지됩니다 . 일반 파일 및 디렉터리의 경우 모든 사용자가 이동할 수 있습니다.만약에소스 및 대상 상위 디렉터리에 대한 읽기+쓰기+실행 권한이 있습니다(예: oldnew예에서는).

mv /path/to/old/source /path/to/new/destination

바라보다POSIXMV그리고POSIX 이름 바꾸기정확한 세부정보를 얻으려면

답변3

이를 수행하는 몇 가지 방법이 있습니다. 원자적이지는 않지만 필요에 따라 충분히 안전해야 합니다.

  • 권한과 소유권을 유지하기 위해 태그를 사용하여 파일을 복사한 -p다음 원본 파일을 삭제할 수 있습니다.cp -p /old/path/file /new/path/ && rm -f /old/path/file

  • rsync를 사용할 수 있습니다.rsync -pogXA --remove-source-files /old/path/file /new/path/

  • 루트인 경우 chmod 000파일을 이동한 다음 적절한 소유자 및 권한을 복원할 수 있습니다.

관련 정보