আমি কীভাবে ভাঙা প্রতীকগুলি খুঁজে পেতে পারি


281

সমস্ত প্রতীকী লিঙ্কগুলি খুঁজে পাওয়ার কোনও উপায় আছে যা কোনওভাবেই নির্দেশ করে না?

find ./ -type l

আমাকে সমস্ত প্রতীকী লিঙ্ক দেবে, তবে কোথাও যে লিঙ্কগুলি এবং যে লিঙ্কগুলি নেই সেগুলির মধ্যে কোনও পার্থক্য রাখে না।

আমি বর্তমানে করছি:

find ./ -type l -exec file {} \; |grep broken

তবে আমি ভাবছি কী বিকল্প সমাধান আছে।

উত্তর:


351

আমি দৃ strongly়ভাবে এই কাজের জন্য ব্যবহার না করার পরামর্শ দেব find -L(ব্যাখ্যা করার জন্য নীচে দেখুন)। এটি করার অন্যান্য কয়েকটি উপায় এখানে রয়েছে:

  • আপনি যদি একটি "বিশুদ্ধ find" পদ্ধতি ব্যবহার করতে চান তবে এটির মতো দেখতে হবে:

    find . -xtype l
    

    ( xtypeকোনও পরীক্ষাটি একটি অবজ্ঞাত লিঙ্কে করা হয়) এটি findযদিও সমস্ত সংস্করণে পাওয়া যায় না । তবে অন্যান্য বিকল্পগুলিও রয়েছে:

  • আপনি কমান্ডের test -eমধ্যে থেকে সম্পাদন করতে পারেন find:

    find . -type l ! -exec test -e {} \; -print
    
  • এমনকি কিছু grepকৌশল আরও ভাল (যেমন, নিরাপদ ) এর চেয়ে ভাল হতে পারে find -Lতবে প্রশ্নের মধ্যে যেমনটি পেশ করা হয়নি (ফাইলের নামগুলি সহ পুরো আউটপুট লাইনে গ্রেপ হয়):

     find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
    

find -Lকৌতুক উদ্ধৃত একাকী দ্বারা থেকে commandlinefu চমৎকার এবং হল hacky দেখায়, কিন্তু এটা এক খুব হয়েছে বিপজ্জনক ফাঁদ : সমস্ত symlinks অনুসরণ করা হয়। নীচে উপস্থাপিত বিষয়বস্তু সহ ডিরেক্টরি বিবেচনা করুন:

$ ls -l
total 0
lrwxrwxrwx 1 michal users  6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/

আপনি যদি find -L . -type lসেই ডিরেক্টরিটিতে চালনা করেন /usr/share/তবে সমস্তগুলি পাশাপাশি অনুসন্ধান করা হবে (এবং এটি সত্যই দীর্ঘ নিতে পারে) 1"আউটগোয়িং লিঙ্কগুলির প্রতিরোধক" কমান্ডের জন্য find, ব্যবহার করবেন না-L


1 এটি কোনও ছোট্ট অসুবিধার মতো দেখাতে পারে (কমান্ডটি "কেবল" সকলকে অতিক্রম করতে দীর্ঘ সময় নিতে পারে /usr/share) - তবে এর আরও গুরুতর পরিণতি হতে পারে। উদাহরণস্বরূপ, ক্রুট পরিবেশ বিবেচনা করুন: এগুলি মূল ফাইল সিস্টেমের কিছু উপ-ডিরেক্টরিতে থাকতে পারে এবং পরম অবস্থানগুলিতে প্রতিলিঙ্ক ধারণ করে। এই লিঙ্কগুলি "বাহ্যিক" সিস্টেমের জন্য ভাঙ্গা বলে মনে হতে পারে, কারণ আপনি ক্রুটটিতে প্রবেশ করার পরে তারা কেবল উপযুক্ত জায়গাগুলির দিকেই নির্দেশ করে। আমি আরও স্মরণ করি যে কিছু বুটলোডার /bootকেবল প্রাথমিক বুট পর্যায়ে সিমলিঙ্ক ব্যবহার করেছিল, যখন বুট পার্টিশনটি মাউন্ট করা হয়েছিল /

সুতরাং আপনি যদি find -Lকোনও নির্দোষ-দৃষ্টিকোণ ডিরেক্টরি থেকে ভাঙা চিহ্নগুলি সন্ধান করতে এবং মুছে ফেলার জন্য কোনও আদেশ ব্যবহার করেন তবে আপনি এমনকি আপনার সিস্টেমটিও ভেঙে দিতে পারেন ...


11
আমি মনে করি -type lযেহেতু নন-লিঙ্কগুলি -xtype lচালিত হবে তাই অপ্রয়োজনীয় -type l। তাই find -xtype lসম্ভবত আপনার প্রয়োজন হয়। এই পদ্ধতির জন্য ধন্যবাদ।
কোর্নিয়ান

3
সচেতন থাকুন যে এই সমাধানগুলি সমস্ত ফাইল সিস্টেমের ধরণের জন্য কাজ করে না। উদাহরণস্বরূপ এটি /proc/XXX/exeলিঙ্কটি নষ্ট হয়েছে কিনা তা যাচাই করার জন্য কাজ করবে না । এই জন্য, ব্যবহার করুন test -e "$(readlink /proc/XXX/exe)"
কিওয়ার্টজগুয়ে

2
@ ফ্লিম এর find . -xtype lঅর্থ "এমন সমস্ত সিমলিংকগুলি সন্ধান করুন যার (চূড়ান্ত) লক্ষ্যযুক্ত ফাইলগুলি সিমলিংক"। তবে একটি সিমিলিংকের চূড়ান্ত লক্ষ্য একটি সিমিলিংক হতে পারে না, অন্যথায় আমরা এখনও লিঙ্কটি অনুসরণ করতে পারি এবং এটি চূড়ান্ত লক্ষ্য নয়। যেহেতু এরকম কোনও প্রতিলিপি নেই, তাই আমরা এগুলি অন্য কিছু হিসাবে বোঝাতে পারি, যেমন ভাঙা প্রতীক।
দুর্বল

2
@ জোডাম "এটি ভেঙে গেলে কেবল প্রতীকী লিঙ্ক হতে পারে"। অতিরিক্ত ভাঙ্গনের পরিবর্তে "ভাঙা প্রতীকী লিঙ্ক" বা "অস্তিত্বের ফাইল" আলাদা আলাদা টাইপ দিন, lতা আমার কাছে কম বিভ্রান্তিকর।
দুর্বল করুন

3
শেষে সতর্কতাটি কার্যকর, তবে মনে রাখবেন যে এটি -Lহ্যাকের ক্ষেত্রে প্রযোজ্য নয় বরং (অন্ধভাবে) সাধারণভাবে ভাঙা প্রতীকগুলি অপসারণ করার জন্য।
অ্যালোস মাহডাল

38

symlinksথেকে কমান্ড http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz বৈশিষ্ট্য বিভিন্ন সঙ্গে symlinks সনাক্ত করতে ব্যবহার করা যেতে পারে। এই ক্ষেত্রে:

$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a

এই সরঞ্জামটি কি অক্সের জন্য উপলব্ধ?
কিড

কিছু মনে করবেন না, এটি সংকলিত হয়েছে।
কিড

2
স্পষ্টতই ফেডোরায় symlinksপ্রাক-ইনস্টল করা আছে।
ড্যানিয়েল জনসন

32

যেমন Rozcietrzewiacz ইতিমধ্যে মন্তব্য করেছে, find -Lসিমলিঙ্কযুক্ত ডিরেক্টরিতে অনুসন্ধানটি প্রসারিত করার অপ্রত্যাশিত পরিণতি হতে পারে, তাই অনুকূল পন্থা নয়। কেউ এখনও যা উল্লেখ করেনি তা তা

find /path/to/search -xtype l

আরও সংক্ষিপ্ত এবং যুক্তিযুক্তভাবে অভিন্ন আদেশ

find /path/to/search -type l -xtype l

এখনও অবধি উপস্থাপিত সমাধানগুলির মধ্যে কোনওটিই চক্রীয় সিমলিংকগুলি সনাক্ত করতে পারে না, এটি অন্য ধরণের ভাঙ্গা। এই প্রশ্ন বহনযোগ্যতা সম্বোধন করে। সংক্ষিপ্তসার হিসাবে, চক্রযুক্ত লিঙ্কগুলি সহ ভাঙা প্রতীকী লিঙ্কগুলি সন্ধানের পোর্টেবল উপায় হ'ল:

find /path/to/search -type l -exec test ! -e {} \; -print

আরও তথ্যের জন্য, এই প্রশ্নটি দেখুন বা ynform.org । অবশ্যই, এই সমস্তের জন্য চূড়ান্ত উত্স হ'ল ফাইন্ডুইলস ডকুমেন্টাটন


1
সংক্ষিপ্ত, কনসাইস এবং ঘাটির find -Lপাশাপাশি চক্রীয় লিঙ্কগুলিকে সম্বোধন করে । +1
ফ্লিম

খুশী হলাম। শেষটি ম্যাকসএক্সএক্স-তেও কাজ করে, যখন @ রোজিট্রিজেভিয়াক্জের উত্তর দেয় নি।
neu242

1
@ neu242 এটা এ কারণে যে সম্ভাবনা রয়েছে -xtypePOSIX উল্লেখিত হয়নি এবং প্রকৃতপক্ষে যদি আপনি তাকান find(1)এটা আছে MacOS মধ্যে -typeকিন্তু না -xtype
প্রাইফটান

7

আমি বিশ্বাস করি -Lআপনার কমান্ডে পতাকা যুক্ত করা আপনাকে গ্রেপ থেকে মুক্তি দিতে সহায়তা করবে:

$ find -L . -type l

http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks

লোকটির কাছ থেকে:

 -L      Cause the file information and file type (see stat(2)) returned 
         for each symbolic link to be those of the file referenced by the
         link, not the link itself. If the referenced file does not exist,
         the file information and type will be for the link itself.

19
প্রথমে আমি এটিকে উজ্জীবিত করেছি, তবে তারপরে আমি বুঝতে পেরেছি এটি কতটা বিপজ্জনক হতে পারে। আপনি এটি ব্যবহার করার আগে, দয়া করে আমার উত্তরটি একবার দেখুন !
rozcietrzewiacz 15'12

6

যদি লিঙ্কটি ভাঙ্গা হয় বা চক্রীয় হয় তবে আপনার যদি অন্য আচরণের প্রয়োজন হয় তবে আপনি% Y সন্ধানের সাথেও ব্যবহার করতে পারেন:

$ touch a
$ ln -s a b  # link to existing target
$ ln -s c d  # link to non-existing target
$ ln -s e e  # link to itself
$ find . -type l -exec test ! -e {} \; -printf '%Y %p\n' \
   | while read type link; do
         case "$type" in
         N) echo "do something with broken link $link" ;;
         L) echo "do something with cyclic link $link" ;;
         esac
      done
do something with broken link ./d
do something with cyclic link ./e

এই পোস্টটি থেকে এই উদাহরণটি অনুলিপি করা হয়েছে (সাইটটি মোছা হয়েছে)

উল্লেখ


যাদের জন্য এখনও অন্য সাধারণভাবে সংক্ষেপে findকমান্ড সমর্থন করে না xtypeএই থেকে আহরিত হতে পারে: find . type l -printf "%Y %p\n" | grep -w '^N'। অ্যান্ডি যেমন আমাকে তাঁর স্ক্রিপ্টে একই (বেসিক) ধারণা দিয়ে মারধর করেছিলেন, আমি আলাদা উত্তর হিসাবে এটি লিখতে নারাজ। :)
সিনট্যাক্সেরর

2

আমি এটি আমার ক্ষেত্রে ব্যবহার করি এবং এটি বেশ ভালভাবে কাজ করে, কারণ আমি ভাঙা প্রতিলিঙ্কগুলি অনুসন্ধান করার জন্য ডিরেক্টরিটি জানি:

find -L $path -maxdepth 1 -type l

এবং আমার ফোল্ডারে এর সাথে একটি লিঙ্ক অন্তর্ভুক্ত রয়েছে /usr/shareতবে এটি এটি অতিক্রম করে না। ক্রস-ডিভাইস লিঙ্কগুলি এবং ক্রুটের জন্য বৈধ যেগুলি ইত্যাদি still এখনও একটি ক্ষতির কারণ তবে আমার ব্যবহারের ক্ষেত্রে এটি যথেষ্ট।


2

সাধারণ নো-বুদ্ধিদীপ্ত উত্তর, যা ওপি'র সংস্করণে একটি প্রকরণ। কখনও কখনও, আপনি কেবল টাইপ করতে বা মনে রাখতে সহজ কিছু চাই:

find . | xargs file | grep -i "broken symbolic link"

1

find -L . -type l |xargs symlinks লিঙ্কটি প্রতি ফাউন্ডফিলের ভিত্তিতে বিদ্যমান কিনা তা আপনাকে তথ্য দেবে।


1

এটি বর্তমান ডিরেক্টরিতে ভাঙ্গা প্রতিলিঙ্কগুলির নাম মুদ্রণ করবে।

for l in $(find . -type l); do cd $(dirname $l); if [ ! -e "$(readlink $(basename $l))" ]; then echo $l; fi; cd - > /dev/null; done

বাশে কাজ করে। অন্যান্য শাঁস সম্পর্কে জানেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.