Vraag Hoe een symlink opheffen / bijwerken?


Ik probeer symbolische koppelingen te gebruiken. Ik heb wat gelezen en vond de volgende opdrachten:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Creations en deleties werken goed. Maar updates werken niet. Na het uitvoeren van deze opdracht wordt de symlink ongeldig.

Ik heb hier en daar gelezen dat het niet mogelijk is om een ​​symlink bij te werken / op te heffen. Er is dus tegenstrijdige informatie op het net. Wie heeft er gelijk? Als een symlink kan worden bijgewerkt / genegeerd, hoe kan ik dit dan bereiken?

Bijwerken

Dit is mijn mappenstructuur:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Van ~/scripts/test/, wanneer ik speel:

ln -s /remote_loc/site1 test_link

een test_link is gemaakt, en ik kan ls -l het, maar het lijkt gebroken (in tegenstelling tot wat ik hierboven in mijn vraag heb gezegd).

Hoe kan ik een link op meerdere directoryniveau's uitvoeren?


150
2018-05-17 12:39


oorsprong


Ik raad aan om te gebruiken unlink in plaats van rm. Met unlink je loopt nooit het risico om bestanden in een bronmap te verliezen door per ongeluk verkeerde schakelaars te gebruiken. - Jpsy
U gebruikt een leidende / in uw opdracht - Jamie Cook
@jpsy zou je advies over ontkoppeling erg goed zijn, als het waar was. Probeer zzzz aan te raken; ontkoppel zzzz. (ontkoppel oproepen, ontkoppel hetzelfde als rm, maar zonder mooie opties, en geen recursie). - ctrl-alt-delor
Waarom gebruik van -n? (kan het probleem zijn). Ook als je Linux ondersteunt -t gebruik het dan, voor deze gevallen, en -T of destination/ voor andere gevallen. - ctrl-alt-delor


antwoorden:


Gebruik makend van -f met ln zal elke link overschrijven die er al was, dus zolang je de juiste rechten hebt, zou het moeten werken ... Het heeft altijd voor me gewerkt. Welk besturingssysteem gebruikt u?


124
2018-05-17 12:49



Ik heb mijn vraag bijgewerkt met meer informatie over mijn probleem. - Jérôme Verstrynge
Ik ben onder linux. - Jérôme Verstrynge
Als u de ln parameters, zoals ik geneigd ben te doen, zal de -f switch vernietig je bestaande bestanden (linkdoelen)? In beide gevallen hebben we de -i parameter (die de gebruiker ook zal vragen om te overschrijven), als u een beetje beveiliging wilt. - palswim
@palswim Dit SO-bericht houdt in dat het veilig is omdat -f gewoon oproepen unlink() en link() onder de motorkap: stackoverflow.com/a/1466570/157385. Ik wou dat ik me de juiste volgorde zou herinneren! - Mike Branski
Werkt niet. behoefte aan -n. Zie geaccepteerd antwoord. - Shawn Welch


Oké, ik heb gemerkt waar mijn fout zit: je moet niet de eerste plaatsen / in pad.

Met andere woorden, de opdrachten in mijn vragen zouden moeten zijn:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

in plaats van

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

gezien mijn geval.


91
2018-05-17 13:32



Voor wat extra informatie over waarom dat is, zijn de verschillen één is een relative pad (zonder de leidende /) en de andere is een absolute pad (met de leidende /). Als je een Linux-systeem beheert, is het KRITISCH dat je de verschillen begrijpt. Bijvoorbeeld het verschil tussen rm -rf ./* en rm -rf /.* beslist of je je baan behoudt of niet :) - Safado
Dit geeft geen antwoord op de vraag 'hoe een symlink bij te werken / te overschrijven' - Sirch
De regel ln -sfn {pad / naar / bestandsnaam} {link-name} doet dat. - Jérôme Verstrynge
Wat is het verschil? -n optie maken? - dokaspar
-n (--no-dereference) zorgt ervoor dat het {link name} behandelt als een normaal bestand in plaats van de link te volgen. Aangezien je op die link moet werken, niet volgen, moet je deze optie gebruiken. - feldoh


Eerste probleem:

Ik citeer u:

Creations en deleties werken goed. Maar updates werken niet. Na   Bij het uitvoeren van deze opdracht wordt de symlink ongeldig.

Het probleem met de gegeven directorystructuur:

~ / scripts / test / ~ / scripts / test / remote_loc /   ~ / Scripts / test / remote_loc / site1 /   ~ / Scripts / test / remote_loc / site1 / stuff1.txt   ~ / Scripts / test / remote_loc / site2 /   ~ / Scripts / test / remote_loc / site2 / stuff2.txt   ~ / Scripts / test / remote_loc / site2 /   ~ / Scripts / test / remote_loc / site3 / stuff3.txt

en gebruik van het commando:

ln -s /remote_loc/site1 test_link

Is dat het creëert een symbolische link in uw $ PWD, of huidige werkmap, die verwijst naar een niet-bestaand bestand van de /, of root, op / remote_loc / site1

Als je PWD zich in ~ / scripts / bevindt, zou je dit moeten hebben gebruikt:

ln -s remote_loc/site1 test_link 

anders had je het volledige absolute pad kunnen gebruiken zoals:

ln -s /home/yourusername/remote_loc/site1 test_link 

Tweede nummer:

Ik citeer u:

Ik heb hier en daar gelezen dat het niet mogelijk is om te updaten / negeren   een symlink. Er is dus tegenstrijdige informatie op het net. Wie is   rechts? Als een symlink kan worden bijgewerkt / genegeerd, hoe kan ik dit dan bereiken?

Voor het beantwoorden van uw vraag "Wie heeft gelijk", weet ik niet zeker wat u precies hebt gelezen of hoe het werd begrepen. Maar het volgende zou moeten helpen oplossen:

  1. Wat kan worden bijgewerkt, en
  2. Wat kan niet worden bijgewerkt zonder het te gebruiken geschikte schakelaars.


Symbolische koppelingen bijwerken met doelen die geen mappen zijn.

ln -sf:
  De -f of --force verwijdert bestaande bestemmingsbestanden. Dit wordt gebruikt om het doel of de bestemming van een koppeling bij te werken.

Voorbeeld:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Maar zoals je ziet, zal het het absolute pad geven als absolute paden aanwezig zijn lnargumenten. Het geven van een volledig pad is noodzakelijk wanneer de huidige werkdirectory anders is dan de bovenliggende map van de koppeling.


Relatieve paden:

ln-sfr:
  De -r of --relatie maakt symbolische koppelingen ten opzichte van de locatie van de link.

Voorbeeld:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Maar het bijwerken van een link naar een map zal niet werken als het doel een map is.

Voorbeeld:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Zoals je kunt zien, ondanks het feit dat absolute padnamen werden gebruikt lnHet bovenstaande argument zonder de -r optie, de symbolische link is nog steeds relatief ten opzichte van de link.


Koppelingen naar mappen bijwerken:

ln -sfrn:
  De -n of - niet-dereference beschouwt LINK_NAME als een normaal bestand als het een symbolische koppeling naar een map is.

Voorbeeld:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

In tegenstelling tot:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

10
2018-06-08 22:58





$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

6
2018-05-17 12:42



Wanneer ik tests met 1 niveau van directory voer, werkt het, maar ik probeer multi-level directories te gebruiken, en het werkt niet. Ik heb mijn vraag bijgewerkt. - Jérôme Verstrynge