파일을 인수로 허용하고 파일을 수정 한 다음 두 번째 인수에 지정된 파일 이름에 파일을 쓰는 명령이 있습니다. 나는 그 프로그램을 부를 것이다 modifyfile
.
나는 그것이 “제자리에서”작동하기를 원했기 때문에 임시 파일로 수정 한 다음 다시 이동시키는 쉘 스크립트 (bash)를 작성했다.
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
이 파일에 대한 사용 권한을 삭제하면 불행한 부작용이 있습니다. 파일은 기본 권한으로 다시 만들어집니다.
mv
권한을 변경하지 않고 대상을 덮어 쓰도록 명령에 지시 하는 방법이 있습니까? 또는 사용자, 그룹 및 권한을 원본에서 저장하고 복원하는 방법이 있습니까?
답변
을 사용하는 대신 mv
리디렉션하십시오 cat
. 예를 들면 다음과 같습니다.
TMP=$(mktemp)
modifyfile "$original" "$TMP"
cat "$TMP" > "$original"
파일 수준에서 아무 것도 건드리지 않고 $original
의 내용으로 덮어 씁니다 $TMP
.
답변
파일을 새 버전으로 바꾸는 두 가지 전략이 있습니다.
-
새 버전으로 임시 파일을 만든 다음 제자리로 이동하십시오.
- 장점 : 프로그램이 해당 파일을 열면 이동 전후에 파일을 열 었는지 여부에 따라 이전 내용 또는 새 내용을 읽습니다. 믹스 업이 없습니다.
- 장점 : 충돌이 발생하면 이전 내용이 유지됩니다.
- 단점 : 새 파일이 만들어 지므로 파일 속성 (소유권, 권한 등)이 유지되지 않습니다.
-
기존 파일을 덮어 씁니다.
- 장점 : 파일의 속성이 유지됩니다.
- 단점 : 충돌이 발생하면 파일을 절반 만 쓸 수 있습니다.
- 단점 : 프로그램을 업데이트 할 때 파일이 열려 있으면이 프로그램은 일치하지 않는 데이터를 읽을 수 있습니다.
가능하면 방법 1을 사용하지만 먼저 원본 파일의 속성을로 복제하십시오 cp -p --attributes-only
. 여기에는 GNU coreutils (즉, 비 임베디드 Linux 또는 충분히 Linux와 유사한 환경)가 필요합니다. 당신의 경우 cp
가없는 --attributes-only
,이 옵션을 생략 : 그것은 작동 것이다 그러나 그것은뿐만 아니라 데이터를 복제 할 수 있습니다.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
기존 파일의 속성을 복제 할 수없는 경우 (예 : 파일에 대한 쓰기 권한이 있지만 소유하지 않고 소유자를 보존하려는 경우) 방법 2 만 가능합니다. 데이터 손실 위험을 최소화하려면
- 파일이 불완전한 창을 가능한 작게 만드십시오. 임시 파일에서 먼저 데이터를 준비한 다음 제자리에 복사하십시오.
- 이전 파일을 먼저 백업하십시오.
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"
답변
첫 번째 답변에 대한 토론 후에 다른 답변을 제안합니다.
TMP="$(mktemp "$original".XXXXXXXXXX)"
modifyfile "$original" "$TMP"
chmod --reference="$original" "$TMP"
chown --reference="$original" "$TMP"
mv -f "$TMP" "$original"
비고 :
- 내가 사용
$original
에mktemp
임시 파일에 저장되지 않도록 템플릿/tmp
하지만 같은 폴더에$original
. 나는 경우에 있다고 생각/tmp
IS가 다른 파일 시스템에 장착 된 작업이 더 이상 원자 없을 것이다. mktemp
공백이 포함 된 경우 결과 가 인용됩니다.$()
더 깨끗하다고 생각하기 때문에“대신 사용 합니다.ch{mod,own} --reference
의 권한을 전송하는 데 사용됩니다$original
에$TMP
. 누군가 메타 데이터를 전송할 수 있고 전송해야 할 아이디어가 더 있다면 내 게시물을 편집하여 추가하십시오.- Gilles가 지적한 것처럼 루트 권한이 필요합니다. 글쎄, 나는 이것을 작성 했으므로 이것을 버리지 않을 것이다. : P