සිම්ලින්ක් අභිබවා / යාවත්කාලීන කරන්නේ කෙසේද?


204

මම සංකේතාත්මක සබැඳි භාවිතා කිරීමට උත්සාහ කරමි. මම කියවීමක් කළ අතර පහත දැක්වෙන විධානයන් සොයා ගතිමි.

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

නිර්මාණ සහ මකාදැමීම් හොඳින් ක්‍රියාත්මක වේ. නමුත් යාවත්කාලීන කිරීම් ක්‍රියා නොකරයි. මෙම විධානය ක්‍රියාත්මක කිරීමෙන් පසු, සිම්ලින්ක් අවලංගු වේ.

සිම් ලින්ක් යාවත්කාලීන කිරීමට / අභිබවා යාමට නොහැකි බව මම මෙහි සහ එහි කියවා ඇත්තෙමි. එබැවින් අන්තර්ජාලයේ පරස්පර විරෝධී තොරතුරු තිබේ. කවුද හරි? සිම්ලින්ක් යාවත්කාලීන කිරීමට / අභිබවා යාමට හැකි නම්, මම මෙය සාක්ෂාත් කරගන්නේ කෙසේද?

යාවත්කාලීන කරන්න

මෙන්න මගේ නාමාවලි ව්‍යුහය:

~/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

සිට ~/scripts/test/, මම රඟපාන විට:

ln -s /remote_loc/site1 test_link

a test_linkනිර්මාණය කර ඇති අතර මට ls -lඑය කළ හැකිය , නමුත් එය කැඩී ඇති බවක් පෙනේ (මගේ ප්‍රශ්නයේදී මා ඉහත කී දෙයට පටහැනිව).

බහු බහලුම් මට්ටමේ සම්බන්ධතාවයක් මා කරන්නේ කෙසේද?


1
unlinkවෙනුවට භාවිතා කිරීමට මම නිර්දේශ කරමි rm. සමග unlinkඔබ වැරදී වැරදි ස්විච භාවිතා කිරීමෙන් ප්රභවය නාමාවලියේ ඕනෑම ගොනු අහිමි අවදානම නැහැ.
Jpsy

ඔබ ඔබේ විධාන ප්රමුඛ / භාවිතා කරන්නේ
ජැමී කුක්

unjpsy unlink පිළිබඳ ඔබේ උපදෙස් සත්‍ය නම් එය ඉතා හොඳ වේ. ස්පර්ශ zzzz උත්සාහ කරන්න; zzzz ඉවත් කරන්න. (ඇමතුම් ඉවත් කරන්න, rm හා සමාන කරන්න, නමුත් විසිතුරු විකල්ප නොමැතිව, සහ පුනරාවර්තනයක් නොමැත).
ctrl-alt-delor

1
භාවිතා කරන්නේ ඇයි -n? (ගැටලුව විය හැකිය). ඔබේ ln සහය දක්වන්නේ -tනම් එය භාවිතා කරන්න, මෙම අවස්ථා සඳහා -Tහෝ destination/වෙනත් අවස්ථා සඳහා.
ctrl-alt-delor

Answers:


166

භාවිතා -fකිරීම lnමඟින් දැනටමත් එහි තිබූ ඕනෑම සබැඳියක් නැවත ලියනු ඇත, එබැවින් ඔබට නිවැරදි අවසර ඇති තාක් කල් එය ක්‍රියාත්මක විය යුතුය ... එය සැමවිටම මා වෙනුවෙන් වැඩ කරයි. ඔබ භාවිතා කරන්නේ කුමන මෙහෙයුම් පද්ධතියද?


මගේ ප්‍රශ්නය පිළිබඳ වැඩි විස්තර සහිතව මම මගේ ප්‍රශ්නය යාවත්කාලීන කර ඇත.
ජෙරොම් වර්ස්ට්‍රින්ජ්

2
මා lnපරාමිතීන් මාරු කළහොත් , මා විසින් සිදු කරනු ලබන පරිදි, -fස්විචය ඔබගේ පවතින ගොනු (සම්බන්ධක ඉලක්ක) විනාශ කරයිද? කෙසේ වෙතත්, -iඔබට යම් ආරක්ෂාවක් අවශ්‍ය නම් , අපට පරාමිතිය ඇත (එමඟින් පරිශීලකයා නැවත ලිවීම සඳහා විමසනු ඇත).
palswim

2
SOpalswim මෙම SO පෝස්ට් එකෙන් ඇඟවෙන්නේ එය -fඇමතුම් unlink()සහ link()හුඩ් යටතේ ඇති නිසා එය ආරක්ෂිත බවයි : stackoverflow.com/a/1466570/157385 . මම හිතන්නේ මම නිවැරදි පිළිවෙල මතක තබා ගන්නවා නම් හොඳයි!
මයික් බ්‍රාන්ස්කි

5
වැඩ කරන්නේ නෑ. අවශ්‍යතා -n. පිළිගත් පිළිතුර බලන්න.
ෂෝන් වෙල්ච්

1
MacOS -nයාවත්කාලීන කිරීමට අවශ්‍ය වේ .
ගොස්

131

හරි, මගේ දෝෂය ඇති තැන මම සොයාගත්තා: යමෙක් පළමු /මාවතට නොයා යුතුය .

වෙනත් වචන වලින් කිවහොත්, මගේ ප්‍රශ්නවල විධානයන් විය යුත්තේ:

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

වෙනුවට

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

මගේ නඩුව සලකා බලමින්.


22
එය එසේ වන්නේ ඇයිද යන්න පිළිබඳ අමතර තොරතුරු සඳහා, වෙනස්කම් එකක් relativeමාර්ගයක් (ප්‍රමුඛ / නොමැතිව) වන අතර අනෙක absoluteමාර්ගයක් (ප්‍රමුඛ / සමඟ) වේ. ඔබ ලිනක්ස් පද්ධතියක් පරිපාලනය කරන්නේ නම් වෙනස්කම් තේරුම් ගැනීම ඉතා වැදගත් වේ. අතර වෙනස උදාහරණයක් rm -rf ./*හා rm -rf /.*ඔබ ඔබේ රැකියාව ආරක්ෂා නැද්ද යන්න තීරණය :)
Safado

6
'සිම් සබැඳියක් යාවත්කාලීන කරන්නේ / ඉක්මවා යන්නේ කෙසේද' යන ප්‍රශ්නයට මෙය පිළිතුරු සපයන්නේ නැත
සර්ච්

Ln -sfn {path / to / file-name} {link-name} line කරයි.
ජෙරොම් වර්ස්ට්‍රින්ජ්

7
-n (--no-dereference) එය සබැඳිය අනුගමනය කරනවාට වඩා ගොනුවක {සබැඳි නම treat ලෙස සලකයි. ඔබට එම සබැඳිය මත ක්‍රියාත්මක වීමට අවශ්‍ය බැවින් එය අනුගමනය නොකරන්න ඔබ මෙම විකල්පය භාවිතා කළ යුතුය.
ෆෙල්ඩෝ

2
මෙම පිළිතුර -nසංකේත සබැඳිය ප්‍රතිස්ථාපනය කිරීම සඳහා පරාමිතිය සමඟ උද්දීපනය කළ පිළිතුර විය යුතුය .
නික් ට්සායි

14

පළමු ප්රශ්නය:

ඔබ උපුටා දැක්වීම:

නිර්මාණ සහ මකාදැමීම් හොඳින් ක්‍රියාත්මක වේ. නමුත් යාවත්කාලීන කිරීම් ක්‍රියා නොකරයි. මෙම විධානය ක්‍රියාත්මක කිරීමෙන් පසු, සිම්ලින්ක් අවලංගු වේ.

ලබා දී ඇති නාමාවලි ව්‍යුහය සමඟ ඇති ගැටළුව:

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

සහ විධානය භාවිතා කරමින්:

ln -s /remote_loc/site1 test_link

එය ඔබගේ $ PWD, හෝ වර්තමාන වැඩ කරන නාමාවලියෙහි සංකේතාත්මක සබැඳියක් නිර්මාණය කරන්නේද, එය /, හෝ root වලින් / remote_loc / site1 හි නොපවතින ගොනුවකට යොමු කරයි.

ඔබේ පීඩබ්ලිව්ඩී ~ / ස්ක්‍රිප්ට් වල තිබේ නම් ඔබ මෙය භාවිතා කළ යුතුව තිබුණි:

ln -s remote_loc/site1 test_link

එසේ නොමැතිනම් ඔබට සම්පූර්ණ නිරපේක්ෂ මාර්ගය භාවිතා කළ හැකිය:

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

දෙවන නිකුතුව:

ඔබ උපුටා දැක්වීම:

සිම් ලින්ක් යාවත්කාලීන කිරීමට / අභිබවා යාමට නොහැකි බව මම මෙහි සහ එහි කියවා ඇත්තෙමි. එබැවින් අන්තර්ජාලයේ පරස්පර විරෝධී තොරතුරු තිබේ. කවුද හරි? සිම්ලින්ක් යාවත්කාලීන කිරීමට / අභිබවා යාමට හැකි නම්, මම මෙය සාක්ෂාත් කරගන්නේ කෙසේද?

"කවුද හරි" යන ඔබේ ප්‍රශ්නයට පිළිතුරු දීමට, ඔබ හරියටම කියවූ දේ හෝ එය තේරුම් ගත්තේ කෙසේදැයි මට විශ්වාස නැත. එහෙත්, පහත දැක්වෙන කරුණු නිරවුල් කිරීමට උපකාරී වේ:

  1. යාවත්කාලීන කළ හැකි දේ, සහ
  2. සුදුසු ස්විච භාවිතා නොකර යාවත්කාලීන කළ නොහැකි දේ.


නාමාවලි නොවන ඉලක්ක සමඟ සංකේතාත්මක සම්බන්ධතා යාවත්කාලීන කිරීම.

ln -sf:
-f හෝ --force පවතින ගමනාන්ත ලිපිගොනු ඉවත් කරයි, මෙය සබැඳියක ඉලක්කය හෝ ගමනාන්තය යාවත්කාලීන කිරීමට භාවිතා කරයි.

උදාහරණයක්:

 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

එහෙත්, ඔබට පෙනෙන පරිදි, නිරපේක්ෂ මාර්ග lnතර්ක වල තිබේ නම් එය නිරපේක්ෂ මාවත ලබා දෙනු ඇත . වර්තමාන වැඩ කරන නාමාවලිය සබැඳියේ මව් නාමාවලියට වඩා වෙනස් වූ විට සම්පූර්ණ මාර්ගයක් ලබා දීම අවශ්‍ය වේ.


සාපේක්ෂ මාර්ග:

ln -sfr:
-r හෝ --relative මඟින් සම්බන්ධකයේ ස්ථානයට සාපේක්ෂව සංකේතාත්මක සබැඳි නිර්මාණය කරයි.

උදාහරණයක්:

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

නමුත්, ඉලක්කය නාමාවලියක් නම්, නාමාවලියකට සබැඳියක් යාවත්කාලීන කිරීම ක්‍රියා නොකරනු ඇත.

උදාහරණයක්:

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

ඔබට පෙනෙන පරිදි, ln-r විකල්පය නොමැතිව ඉහත තර්කයේ දක්වා ඇති නිරපේක්ෂ මාර්ග නාම භාවිතා කළද , සංකේතාත්මක සබැඳිය තවමත් සබැඳියට සාපේක්ෂ වේ.


නාමාවලි වෙත සබැඳි යාවත්කාලීන කරන්න:

ln -sfrn:
-n හෝ --no-dereference LINK_NAME නාමාවලියකට සංකේතාත්මක සම්බන්ධකයක් නම් එය සාමාන්‍ය ගොනුවක් ලෙස සලකයි.

උදාහරණයක්:

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

ඊට වෙනස්ව:

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

7
$ 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

මම 1 මට්ටමේ ඩිරෙක්ටරියක් සමඟ පරීක්ෂණ සිදු කරන විට, එය ක්‍රියාත්මක වේ, නමුත් මම බහු මට්ටමේ නාමාවලි භාවිතා කිරීමට උත්සාහ කරමි, එය ක්‍රියා නොකරයි. මම මගේ ප්‍රශ්නය යාවත්කාලීන කර ඇත.
ජෙරොම් වර්ස්ට්‍රින්ජ්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.