Как удалить все символические ссылки со специальной целью?

С помощью команды:

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/

Вы можете использовать это, чтобы удалить все символические ссылки:

 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 

С современной find которая поддерживает -lname :

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

должен это сделать.

Решение find отлично.

На всякий случай, если ваш поиск не поддерживает -lname , вот еще один способ, который использует только shell и readlink .

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