Подтвердить что ты не робот

Удалить все сломанные символические ссылки с линией?

Для данной папки, как я могу удалить все неработающие ссылки внутри нее?

Я нашел этот ответ, который показывает, как удалить одну неработающую ссылку, но я не могу объединить ее в одну строку. Есть ли для этого однострочный?

Сломанная символика - это ссылка, указывающая на файл/папку, которая больше не существует.

4b9b3361

Ответ 1

Здесь POSIX способ удаления всех сломанных символических ссылок в текущем каталоге без рекурсии. Он работает, сообщая find об обращении символьных ссылок (-L), но останавливая (-prune) в каждом каталоге-или-символьном-link-to-such.

find -L . -name . -o -type d -prune -o -type l -exec rm {} +

Вы также можете использовать цикл оболочки. Тест -L соответствует символическим ссылкам, а -e соответствует существующим файлам (исключая сломанные символические ссылки).

for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done

Если вы хотите переписывать в подкаталоги, этот метод не работает. С помощью GNU find (как показано на не встроенных Linux и Cygwin) вы можете использовать предикат -xtype для обнаружения сломанных символических ссылок (-xtype использует тип цели для символических ссылок и отчеты l для неработающих ссылок).

find -xtype l -delete

POSIXly, вам нужно объединить два инструмента. Вы можете использовать find -type l -exec … для вызова команды на каждой символической ссылке и [ -e "$x" ] для проверки того, не связана ли эта ссылка.

find . -type l -exec sh -c 'for x; do [ -e "$x" ] || rm "$x"; done' _ {} +

Самое простое решение - использовать zsh. Чтобы удалить все сломанные символические ссылки в текущем каталоге:

rm -- *([email protected])

Символы в круглых скобках glob qualifiers: - для разыменования символических ссылок @ для соответствия только символическим ссылкам (комбинация [email protected] означает только сломанные символические ссылки) и D для соответствия точечным файлам. Чтобы переписать в подкаталоги, сделайте это rm -- **/*([email protected]).

Ответ 2

Простой ответ, основанный на ответе, который вы связали (для данного каталога, $DIR):

find -L $DIR -maxdepth 1 -type l -delete

Ответ 4

Из man find ПРИМЕРЫ:

find -L /usr/ports/packages -type l -exec rm -- {} +

Удалите все сломанные символические ссылки в /usr/ports/packages.

Ответ 5

Пакет symlinks предварительно установлен во многих дистрибутивах (включая Ubuntu 16.04 и Fedora 25) и имеет некоторые действительно полезные функции, один из которых делает именно то, что вы ищете:

symlinks -d ./

Ответ 6

Вы можете использовать readlink, чтобы определить, нарушена ли символическая ссылка.

Ниже перечислены все сломанные символические ссылки в заданной директории (и подкаталогах):

find . -type l -exec sh -c 'readlink -f "{}" 1>/dev/null || echo "{}"' -- "{}" \;

Замените echo на rm, чтобы избавиться от сломанных!

(Я перенаправил вывод readlink в /dev/null, чтобы избежать путаницы, он должен указать цель для символических ссылок.)

Ответ 7

Для MAC выполните сухой пробег следующим образом: -

DIR=<some path>
find -L $DIR -maxdepth 1 -type l -print

Теперь вы можете обрезать старые символические ссылки следующим образом: -

for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done