kopiowanie pliku na twardy link

3

Niedawno ugryzłem się w niewłaściwym zachowaniu w moim skrypcie basha i zastanawiałem się:

  1. czy jest to oczekiwane zachowanie systemu, czy jest to błąd
  2. jakie są idealne obejścia

Zasadniczo problem sprowadzał się do tego. Najpierw miałem istniejącą strukturę katalogów z następującym układem.

  • /opt/dir/file.a
  • /opt/dir/file.b
  • /opt/dir/file

gdzie file jest twarde łącze do file.a. Chciałem wymienić file z wybranym skryptem powłoki file.a lub file.b w zależności od parametrów, więc uruchomiłem coś takiego:

cp my_file /opt/dir/file

Problem polega na tym, że od tego czasu file jest twardym linkiem do file.a, (co oznacza, że ​​te dwa pliki są tak naprawdę dwiema nazwami dla tego samego i-węzła), zmiana została odzwierciedlona w obu file i file.a. To było oczywiście nie to, co chciałem.

Wydaje się, że cp polecenie skutecznie otwarte /opt/dir/file z flagą obcięcia pliku coś w stylu: fopen("file", "w+"). i napisałem do niego. Spodziewałem się, że złamie twarde łącze, odkąd kopiowałem Nowy plik do tej nazwy.

Czy to prawidłowe i oczekiwane zachowanie cp? Wydaje mi się to mało intuicyjne. Kiedy kopiuję plik z jednej lokalizacji do drugiej, w moim umyśle zastępuję go, a nie przepisuję. Czy jest tam flaga? cp uniknąć tego? Moja obecna praca polega na tym, że ja rm /opt/dir/file && cp my_file /opt/dir/file.

Patrząc na stronę man to pojawia się że cp --remove-destination my_file /opt/dir/file może być właściwym rozwiązaniem, ale wciąż jestem zainteresowany tym, co każdy ma do powiedzenia na ten temat.

Evan Teran
źródło
Właściwie jest to dla mnie bardzo intuicyjne. To ten sam plik. Piszesz do tego samego pliku. Oba miejsca otrzymują zaktualizowaną zawartość. Ale to, co jest intuicyjne, różni się w zależności od osoby i trudno jest podać jednoznaczną, doskonałą odpowiedź. Tylko opinie. IMHO to sprawia, że ​​nie jest tematem.
Hennes
@Hennes, dzięki za odpowiedź. Powiedziałbym, że istnieje różnica między „trudno odpowiedzieć” a „poza tematem”. Z pewnością odpowiedź może być „przede wszystkim oparta na opinii”, ale to inna historia. Chciałbym wyjaśnić powód, dla którego uznałem to za mało intuicyjne. Wiem, że pisanie do jednego aktualizuje oba, ale , mój umysłowy obraz kopii ma „zastąpić” miejsce docelowe, a nie „zaktualizować” go. Rozumiem jednak twój punkt widzenia /
Evan Teran
Myślę, że pytanie jest trudne zarówno do odpowiedzi, będzie mieć opinie, jest interesujące i dobrze napisane. Dla mnie trzy z nich sprawiają, że to dobre pytanie Superużytkownik . Is there a flag for cp to avoid this? sprawia, że ​​jest to rzeczywiste pytanie. (na które sam odpowiedziałeś).
Hennes

Odpowiedzi:

2

To, co opisujesz, to prawidłowe zachowanie dla cp, nie błąd. Biorąc pod uwagę wynik, którego szukasz, modyfikację skryptu ( rm śledzony przez cp ) brzmi jak właściwe podejście.

Mox
źródło