Trzymam moje pliki dot pod kontrolą wersji, a wdrażanie ich przez skrypt tworzy twarde linki. Używam również, etckeeper
aby poddać moją /etc
kontrolę wersji. Ostatnio otrzymałem takie ostrzeżenia:
warning: hard-linked files could cause problems with bzr
Prosta kopia ( cp filename.ext filename.ext
) nie będzie działać:
cp: `filename.ext' and `filename.ext' are the same file
Zmiana nazwy / przeniesienie pliku - z wyjątkiem woluminów - również nie przerywa twardego łącza.
Moje pytanie brzmi zatem: czy istnieje sposób na zerwanie twardego łącza do pliku bez konieczności dowiedzenia się, gdzie znajdują się inne twarde łącze / pliki tego pliku?
Odpowiedzi:
Czyniąc go skryptowalnym:
Wykonanie kopii najpierw, a następnie przeniesienie jej na miejsce ma tę zaletę, że plik atomowo zmienia się z twardego łącza w oddzielną kopię (nie ma momentu, w którym
filename
jest częściowy lub brakujący).źródło
Prawdopodobnie masz na myśli to, że chcesz podzielić twardy link na osobny, niezależny plik.
Hardlink to połączenie między wpisem w katalogu a blokiem i-węzła na dysku.
i-węzły przechowują metadane plików, aw przypadku małych plików niektóre systemy plików przechowują dane w i-węzle, w przeciwnym razie wskaźniki do bloków danych, aw przypadku bardzo dużych plików pośrednie i podwójnie pośrednie listy wskaźników do jednostek alokacji dysku.
Niezależnie od tego połączenie między nazwą pliku (która jest wynikiem polecenia ls) a blokiem i-węzła, który przechowuje te metadane, nazywa się twardym łączem.
Posiadanie wielu twardych dowiązań do jednego pliku oznacza ten sam i-węzeł, do którego odwołuje się więcej niż jedna pozycja katalogu, być może w różnych katalogach (w jednym systemie plików)
rm usuwa wpis nazwy pliku z katalogu. Gdy do i-węzła nie będą się już odwoływać żadne pliki, jego przestrzeń zostanie zwolniona do wykorzystania przez inne pliki.
źródło
cp
imv
przykłady domniemanych. Rozumiem, więc nie ma mowy o używaniu pliku tymczasowego.cp -a
(przynajmniej coreutils GNU).Umieść to na końcu pliku ~ / .bashrc.
Uruchom to w ten sposób
źródło
Najlepszym sposobem, aby to zrobić za pomocą skryptu bash, byłoby coś takiego:
punkty do odnotowania:
mktemp
do generowania pliku, który z pewnością nie istnieje-f
aby wymusić nadpisanie i--preserve=all
zachować metadane możliwie najbardziej zbliżone do oryginalnego pliku--
i,"
aby zacytować ścieżki zawierające spacje i / lub zaczynające się od-
Wykonanie zamiany bez tworzenia pliku tymczasowego nie jest możliwe w przypadku bieżących wywołań systemowych linux (3.16): chociaż możliwe jest zastąpienie pliku atomowo (tj. Usunięcie starego pliku i zastąpienie go nowym jako pojedynczą operacją), to nie jest to możliwe w przypadku pliku, który nie ma nazwy w systemie plików (tzn. plik tymczasowy utworzony przy użyciu
O_TMPFILE
flagiopen
funkcji), ponieważrename
funkcja wymaga nazwy pliku jako danych wejściowych (nie ma wersji,rename
która przyjmuje jako dane wejściowe deskryptor pliku - zobacz tutaj szczegóły)źródło
dirname
imktemp
połączeniach. Naprawiono to dla ciebie ...$( ... )
zastąpienia polecenia -style. Jednym z powodów jest ładniejszy niż` ... `
styl.`
żebyś wprowadził:`\``
(oczywiście, podwójnie uniknąłem tego, aby pokazać ci, co piszesz).Polecenie, którego szukasz, to
unlink
źródło
cp
imv
chciałem wyjaśnić, że chcę, aby plik istniał później.Jeśli szukasz całej nazwy pliku, która jest dowiązaniem twardym do tego pliku, możesz użyć:
również
ls -il myknowhardlinkfile
pokaże liczbę pliku hardlinked do tego samego węzła (trzecie pole).źródło