سؤال كيفية تجاوز / تحديث ارتباط رمزي؟


أحاول استخدام الروابط الرمزية. لقد قمت ببعض القراءة ووجدت الأوامر التالية:

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

إبداعات وحذف تعمل بشكل جيد. لكن التحديثات لا تعمل. بعد تنفيذ هذا الأمر ، يصبح الارتباط الرمزي غير صالح.

لقد قرأت هنا وهناك أنه ليس من الممكن تحديث / تجاوز ارتباط رمزي. إذن هناك معلومات متناقضة على الشبكة. من على حق؟ إذا كان من الممكن تحديث / إلغاء ارتباط رمز Symlink ، كيف يمكنني تحقيق ذلك؟

تحديث

هنا هي بنية الدليل الخاص بي:

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

ا test_link يتم إنشاؤه ، وأستطيع ls -l ذلك ، ولكن يبدو مكسورة (على عكس ما قلته أعلاه في سؤالي).

كيف أقوم بإجراء ارتباط مستوى دليل متعدد؟


153
2018-05-17 12:39


الأصل


أوصي باستخدام unlink بدلا من rm. مع unlink لا تخاطر أبدًا بفقد أية ملفات في دليل المصدر عن طريق الخطأ باستخدام مفاتيح خاطئة. - Jpsy
كنت تستخدم القيادة / في الأمر الخاص بك - Jamie Cook
jpsy ستكون نصيحتك بشأن إلغاء الربط جيدة جدًا ، لو كان صحيحًا. حاول أن تلمس zzzz؛ إلغاء ارتباط zzzz. (قم بإلغاء ربط المكالمات ، وإلغاء ربط نفس rm ، ولكن بدون خيارات خيالية ، وعدم التكرار). - ctrl-alt-delor
لماذا استخدام -n؟ (قد تكون المشكلة). أيضا إذا يدعم LN الخاص بك -t ثم استخدامه ، لهذه الحالات ، و -T أو destination/ للحالات الأخرى. - ctrl-alt-delor


الأجوبة:


عن طريق -f مع ln سيحل محل أي رابط كان موجودًا بالفعل ، طالما أن لديك الأذونات الصحيحة ، يجب أن تعمل ... إنها تعمل دائمًا من أجلي. ما هو نظام التشغيل الذي تستخدمه؟


125
2018-05-17 12:49



لقد قمت بتحديث سؤالي بمزيد من المعلومات حول مشكلتي. - Jérôme Verstrynge
أنا تحت لينكس. - Jérôme Verstrynge
إذا قمت بالتبديل ln المعلمات ، كما أنا عرضة للقيام ، سوف -f التبديل تدمير ملفاتك الحالية (أهداف الارتباط)؟ في كلتا الحالتين ، لدينا -i المعلمة (التي ستطالب المستخدم بالكتابة فوق) كذلك ، إذا كنت تريد قليلاً من الأمان. - palswim
@ palswim تشير رسالة SO هذه إلى أنها آمنة -f مجرد مكالمات unlink() و link() تحت الغطاء: stackoverflow.com/a/1466570/157385. أتمنى لو كنت فقط أتذكر الترتيب الصحيح ، على الرغم من! - Mike Branski
لا يعمل. الاحتياجات -n. انظر الإجابة المقبولة. - Shawn Welch


حسنًا ، لقد وجدت خطأي: يجب ألا يضع الشخص الأول / في الطريق.

بمعنى آخر ، يجب أن تكون الأوامر في أسئلتي:

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}

النظر في قضيتي.


93
2018-05-17 13:32



للحصول على بعض المعلومات الإضافية حول سبب ذلك ، فإن الاختلافات هي واحد هو relative المسار (بدون الرائدة /) والآخر هو absolute المسار (مع الرائدة /). إذا كنت تدير نظام Linux ، فمن المهم للغاية فهم الاختلافات. على سبيل المثال الفرق بين rm -rf ./* و rm -rf /.* تقرر ما إذا كنت تحتفظ بعملك أم لا :) - Safado
لا يجيب هذا عن السؤال "كيفية تحديث / تجاوز رابط sym" - Sirch
السطر ln -sfn {path / to / file-name} {link-name}. - Jérôme Verstrynge
ما الفرق يفعل -n جعل الخيار؟ - dokaspar
-n (- no-dereference) يجعله يعالج {link name} كملف عادي بدلاً من اتباع الارتباط. وبالنظر إلى أنك تحتاج إلى العمل على هذا الرابط دون متابعته ، يجب عليك استخدام هذا الخيار. - feldoh


العدد الأول:

نقلا عنك:

إبداعات وحذف تعمل بشكل جيد. لكن التحديثات لا تعمل. بعد   عند تنفيذ هذا الأمر ، يصبح الارتباط الرمزي غير صالح.

المشكلة مع هيكل الدليل المحدد:

~ / scripts / test / ~ / scripts / test / remote_loc /   ~ / مخطوطات / اختبار / remote_loc / لدى Site1 /   ~ / مخطوطات / اختبار / remote_loc / لدى Site1 / stuff1.txt   ~ / مخطوطات / اختبار / remote_loc / site2 /   ~ / مخطوطات / اختبار / remote_loc / site2 / stuff2.txt   ~ / مخطوطات / اختبار / remote_loc / site2 /   ~ / مخطوطات / اختبار / remote_loc / site3 / stuff3.txt

واستخدام الأمر:

ln -s /remote_loc/site1 test_link

هل هذا هو إنشاء رابط رمزي في PWD $ ، أو دليل العمل الحالي ، الذي يشير إلى ملف غير موجود قبالة / ، أو الجذر ، في / remote_loc / site1

إذا كان الأشخاص ذوي الإعاقة في ~ / scripts / ، فيجب أن تستخدم هذا:

ln -s remote_loc/site1 test_link 

آخر يمكنك استخدام المسار المطلق الكامل مثل:

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

العدد الثاني:

نقلا عنك:

لقد قرأت هنا وهناك أنه ليس من الممكن تحديث / تجاوز   ارتباط رمزي. إذن هناك معلومات متناقضة على الشبكة. الذي هو   حق؟ إذا كان من الممكن تحديث / إلغاء ارتباط رمز Symlink ، كيف يمكنني تحقيق ذلك؟

للإجابة على سؤالك "من هو على حق" ، لست على يقين ما تقرأ بالضبط ، أو كيف تم فهمها. ولكن ، يجب أن يساعد ما يلي في توضيح ما يلي:

  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

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



عندما أقوم بإجراء اختبارات بمستوى واحد من الدليل ، فإنه يعمل ، لكنني أحاول استخدام دلائل متعددة المستويات ، وهو لا يعمل. لقد قمت بتحديث سؤالي. - Jérôme Verstrynge