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

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 это может быть:

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
0xC0000022L
источник
Эта команда удаляет все символические ссылки? Пожалуйста, смотрите мои изменения выше ..
Марко Даниэль
@ Марко: да, первые три строки будут. Редактирование еще :)
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, вот еще один способ, который использует только shell и readlink.

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done
Mikel
источник
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
wallance
источник
Так как эти пути, как 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