බිඳුණු සිම්ලින්ක් සොයා ගන්නේ කෙසේද?


311

කිසිසේත්ම යොමු නොවන සියලු සංකේතාත්මක සබැඳි සොයා ගැනීමට ක්‍රමයක් තිබේද?

find ./ -type l

මට සියලු සංකේතාත්මක සබැඳි ලබා දෙනු ඇත, නමුත් කොහේ හෝ යන සබැඳි සහ නැති සබැඳි අතර වෙනසක් නැත.

මම දැනට කරන්නේ:

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

නමුත් මම කල්පනා කරන්නේ විකල්ප විසඳුම් මොනවාද යන්නයි.

Answers:


387

කාර්යය සඳහා භාවිතා නොකරන ලෙස මම තරයේ යෝජනා කරමි 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) - නමුත් වඩා දරුණු ප්‍රතිවිපාක ඇති කළ හැකිය. නිදසුනක් ලෙස, chroot පරිසරයන් සලකා බලන්න: ඒවා ප්‍රධාන ගොනු පද්ධතියේ සමහර උප බහලුමක පැවතිය හැකි අතර නිරපේක්ෂ ස්ථානවලට සමමුහුර්ත අඩංගු වේ. එම සම්බන්ධතා "පිටත" පද්ධතිය සඳහා කැඩී ඇති බවක් පෙනෙන්නට තිබේ, මන්ද ඒවා නිසි ස්ථාන වෙත යොමු වන්නේ ඔබ chroot වෙත ඇතුළු වූ පසු පමණි. සමහර ඇරඹුම් කාරකය ඒ යටතේ සිම්ලින්ක් භාවිතා කළ බව මට මතකයි /boot, ආරම්භක ඇරඹුම් අවධියේදී, ඇරඹුම් කොටස සවිකරන විට පමණි /.

එබැවින් find -Lහානිකර නොවන පෙනුමක් ඇති නාමාවලියකින් කැඩුණු සිම්ලින්ක් සොයා ගැනීමට සහ මකා දැමීමට ඔබ විධානයක් භාවිතා කරන්නේ නම් , ඔබට ඔබේ පද්ධතිය පවා බිඳ දැමිය හැකිය ...


13
මම හිතන්නේ -type lඅතිරික්තයක් ඇති බැවින් සබැඳි නොවන -xtype lපරිදි ක්‍රියාත්මක වේ -type l. ඒ නිසා find -xtype lබොහෝ විට සියලු ඔබට අවශ්ය වේ. මෙම ප්රවේශයට ස්තූතියි.
quornian

3
සියලුම ගොනු පද්ධති වර්ග සඳහා එම විසඳුම් ක්‍රියා නොකරන බව මතක තබා ගන්න. උදාහරණයක් ලෙස /proc/XXX/exeසබැඳිය කැඩී ඇත්දැයි පරීක්ෂා කිරීම සඳහා එය ක්‍රියා නොකරනු ඇත . මේ සඳහා භාවිතා කරන්න test -e "$(readlink /proc/XXX/exe)".
qwertzguy

2
LiFlimm find . -xtype lයන්නෙහි තේරුම "(අවසාන) ඉලක්කගත ලිපිගොනු වන සිම්ලින්ක් සොයා ගන්න" යන්නයි. නමුත් සිම් ලින්ක් එකක අවසාන ඉලක්කය සිම්ලින්ක් විය නොහැක, එසේ නොමැතිනම් අපට තවමත් සබැඳිය අනුගමනය කළ හැකි අතර එය අවසාන ඉලක්කය නොවේ. එවැනි සමමුහුර්තයන් නොමැති බැවින්, අපට ඒවා වෙනත් දෙයක් ලෙස අර්ථ දැක්විය හැකිය, එනම් බිඳුණු සිම්ලින්ක්.
දුර්වල කරන්න

2
@ ජොඩම් "එය කැඩී ගියහොත් පමණක් සංකේතාත්මක සම්බන්ධකයක් විය හැකිය". "කැඩුණු සංකේතාත්මක සබැඳිය" හෝ "නොපවතින ගොනුවක්" ලබා දීම, අධික බර පැටවීම වෙනුවට තනි වර්ගයක් lමට ව්‍යාකූල වේ.
දුර්වල කරන්න

3
අවසානයේ ඇති අනතුරු ඇඟවීම ප්‍රයෝජනවත් වේ, නමුත් මෙය -Lඅනවසරයෙන් අදාළ නොවන අතර පොදුවේ කැඩුණු සමමුහුර්ත ඉවත් කිරීමට (අන්ධ ලෙස) අදාළ වන බව සලකන්න .
ඇලෝයිස් මහඩාල්

42

මෙම 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

මෙම මෙවලම osx සඳහා තිබේද?
qed

කමක් නෑ, එය සම්පාදනය කළා.
qed

2
පෙනෙන විදිහට symlinksෆෙඩෝරා හි පෙර ස්ථාපනය කර ඇත.
ඩැනියෙල් ජොන්සන්

34

Rozciorzewiacz දැනටමත් අදහස් දක්වා find -Lඇති පරිදි, සෙවුම් සමමුහුර්ත නාමාවලි වලට ව්‍යාප්ත කිරීමේ අනපේක්ෂිත ප්‍රති ence ල ඇති විය හැකිය, එබැවින් ප්‍රශස්ත ප්‍රවේශය නොවේ. කිසිවෙකු තවම සඳහන් කර නැති දෙය එයයි

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
Flimm

හොඳයි. අන්තිම එක මැකෝස්එක්ස් හි ද ක්‍රියා කරයි, නමුත් @ රෝසිටෙරෙස්වියාක්ස්ගේ පිළිතුර එසේ නොවීය.
neu242

1
නිසා ඇතිවිය හැකි බව neu242 @ -xtypePOSIX හි නිශ්චිතව දක්වා නැති අතර ඇත්ත වශයෙන්ම ඔබ දෙස බලන්න නම් find(1)macOS එය ඇත -typeනමුත් නොවේ -xtype .
ප්‍රිෆ්ටන්

9

-Lඔබේ විධානයට ධජය එක් කිරීමෙන් ඔබට grep ඉවත් කර ගත හැකි වනු ඇතැයි මම විශ්වාස කරමි :

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

20
මුලදී මම මෙය ඉහළට ඔසවා තැබුවෙමි, නමුත් එය කොතරම් භයානක විය හැකිදැයි පසුව මට වැටහුණි . ඔබ එය භාවිතා කිරීමට පෙර, කරුණාකර මගේ පිළිතුර දෙස බලන්න !
rozciorzewiacz

7

සබැඳිය කැඩී හෝ චක්‍රීයද යන්න ඔබට වෙනස් හැසිරීමක් අවශ්‍ය නම් ඔබට සොයාගැනීමෙන්% 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'. ඇන්ඩි ඔහුගේ පිටපතේ ඇති එකම (මූලික) අදහසින් මට එයට පහර දුන් නිසා, එය වෙනම පිළිතුරක් ලෙස ලිවීමට මම පසුබට විය. :)
syntaxerror

3

OP හි අනුවාදයේ විචලනය වන සරල මොළයක් නැති පිළිතුරකි. සමහර විට, ඔබට ටයිප් කිරීමට හෝ මතක තබා ගැනීමට පහසු යමක් අවශ්‍ය වේ:

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

නැතහොත්, ඔබට NULL ටර්මිනේටර් හැසිරවීමට අවශ්‍ය නම්:

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

ඒ හා සමානව, ඔබට ද කළ හැකිය find . > /dev/nullstderr ප්‍රතිදානය දෙස බලන්න.
ශ්‍රීධර් සර්නොබත්

2

මම මෙය මගේ නඩුව සඳහා භාවිතා කරන අතර එය හොඳින් ක්‍රියා කරයි, බිඳුණු සමමුහුර්ත සෙවීම සඳහා නාමාවලිය මම දනිමි:

find -L $path -maxdepth 1 -type l

මගේ ෆෝල්ඩරයට සබැඳියක් ඇතුළත් /usr/shareනමුත් එය ගමන් නොකරයි. හරස් උපාංග සම්බන්ධතා සහ chroots යනාදිය සඳහා වලංගු වන ඒවා තවමත් අන්තරායක් වන නමුත් මගේ භාවිතය සඳහා එය ප්‍රමාණවත්ය.



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

Bash හි වැඩ කරයි. වෙනත් ෂෙල් වෙඩි ගැන නොදන්න.

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.