Як я можу видалити всі символічні посилання зі спеціальною ціллю?


43

За допомогою команди:

ls -la *

Я можу перерахувати всі мої символічні посилання.

Як я можу видалити всі символьні посилання, пов’язані із спеціальною папкою?

Наприклад:

У моєму каталозі usr/local/binє такі записи:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

Тепер я хочу видалити всі посилання з контуру /usr/local/texlive/


1
Ви маєте на увазі видалити всі посилання, пов’язані з цільовою папкою? Або перемістити всі знайдені посилання в певну папку?
Джордж М

@uther: Я маю на увазі видалення посилань.
Марко Даніель

Відповіді:


63

Будь ласка, обов'язково прочитайте альтернативну відповідь . Це ще більше, хоча до цього моменту він не проголосував так високо.

Ви можете використовувати це для видалення всіх символічних посилань:

find -type l -delete

з сучасними findверсіями.

На старих версіях пошуку це може бути:

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

Щоб обмежитися певною ціллю посилання, якщо припустимо, що жоден із шляхів не містить символу нової лінії:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

або добре відформатований

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

Звичайно, це ifможе включати і більш складні умови, такі як відповідність шаблону grep.


З урахуванням вашої справи:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

або добре відформатовано:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done

Чи видаляє ця команда всі посилання? Будь ласка, дивіться мою редакцію вище ..
Marco Daniel

@Marco: так, перші три рядки би. Редагування більше :)
0xC0000022L

Я також додав би -printв кінці findкоманди, щоб отримати візуальний відгук.
runlevel0

30

З сучасним, findщо підтримує -lname:

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

повинен це зробити.


1
Це чудове і просте рішення. Я тестував, і це працює як шарм. Спасибі
Марко Даніель

Імовірно, що це повинно бутиfind /usr/local/bin
Джеймс Янгмен

1
Навіть не сучасний, обов’язково. В GNU findбуло -lnameдовше, ніж я підтримував (приблизно з 2003 року).
Джеймс Янгмен

@JamesYoungman: Дякую! Під сучасним findя справді мав на увазі GNU find. ;) Я використовував usr/local/bin, тому що саме це використовувало ОП.
Крістофер Хаммарстрем

5

findРішення велике.

На випадок, якщо ваш пошук не підтримує -lname, ось ще один спосіб, який використовує лише оболонку та readlink.

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done

1

З zsh:

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:Pповністю вирішує шлях до безсинклінгового, тому, якщо припустити /usr/local/texlive, що сама посилання є безкоштовною, вона видалить усі файли, які після роздільної здатності символьної посилання живуть, під /usr/local/textliveякими будуть міститись посилання на, /usr/local/texlive/fooа також на ../texlive/barабо до /usr/./local/texlive/whateverабо на /some/other/symlinkякі саме посилання вказує /usr/local/texlive, тощо. .


0

Перейдіть до контуру і встановіть собі конфігурацію шляху

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf

Оскільки це такі шляхи, usr/local/binякі grepшукають, grep -Eце шлях. Інакше результатів не буде. Крім того, hв lsне може виступати в ніякої мети тут! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Детальніше дивіться man lsабоman grep
ss_iwe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.