Mam polecenie, które akceptuje plik jako argument, modyfikuje plik, a następnie zapisuje go do nazwy pliku określonej w drugim argumencie. Zadzwonię do tego programu modifyfile
.
Chciałem, żeby działał „na miejscu”, więc napisałem skrypt powłoki (bash), który modyfikuje go do pliku tymczasowego, a następnie przenosi go z powrotem:
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
Ma to niefortunny efekt uboczny niszczenia uprawnień do tego pliku. Plik zostanie ponownie utworzony z domyślnymi uprawnieniami.
Czy istnieje sposób na mv
polecenie polecenia zastąpienia miejsca docelowego bez zmiany jego uprawnień? Czy alternatywnie istnieje sposób na uratowanie użytkownika, grupy i uprawnień od oryginału i przywrócenie ich?
źródło
rm "$TMP"
, ale wydaje się, że robię to, co chcę.mv
zamiast tego. Nie widzę sposobu na rozwiązanie tego problemu.chown
działa tylko jako root.chmod
ichgrp
może, ale nie musi, działać w zależności od uprawnień użytkownika. Nie kopiuje także innych atrybutów, takich jak ACL lub atrybuty rozszerzone specyficzne dla systemu plików.Istnieją dwie strategie zastępowania pliku nową wersją:
Utwórz plik tymczasowy w nowej wersji, a następnie przenieś go na miejsce.
Zastąp stary plik na miejscu.
Jeśli możesz, użyj metody 1, ale najpierw zreplikuj atrybuty oryginalnego pliku za pomocą
cp -p --attributes-only
. Wymaga to GNU coreutils (tj. Niewbudowanego systemu Linux lub środowisk wystarczająco podobnych do systemu Linux). Jeślicp
nie masz--attributes-only
, pomiń tę opcję: będzie działać, ale również powiela dane.Jeśli nie możesz replikować atrybutów istniejącego pliku, na przykład ponieważ masz do niego uprawnienia do zapisu, ale nie jesteś jego właścicielem i chcesz zachować właściciela, to możliwa jest tylko metoda 2. Aby zminimalizować ryzyko utraty danych:
źródło
cp -p --attributes-only "$original" "$tmp"
nie będą używać zasobów do kopiowania zawartości pliku. Nie mogłem znaleźć, z której wersji ten argument został dodany.cp
implementacji.Po naszej dyskusji na temat pierwszej odpowiedzi proponuję inną odpowiedź:
Uwagi:
$original
wmktemp
szablonie, aby upewnić się, że plik tymczasowy nie jest umieszczony/tmp
w tym samym folderze co$original
. Uważam, że jeśli/tmp
jest zamontowany na innym systemie plików, operacja nie byłaby już atomowa.mktemp
jest teraz cytowany, jeśli zawiera spacje.$()
zamiast `` ponieważ uważam to za czystsze.ch{mod,own} --reference
służą do przeniesienia uprawnień$original
do$TMP
. Jeśli ktoś ma dodatkowe pomysły na to, jakie metadane mogą i powinny zostać przeniesione, edytuj mój post i dodaj go.źródło