Удалить все сломанные символические ссылки с линией?
Для данной папки, как я могу удалить все неработающие ссылки внутри нее?
Я нашел этот ответ, который показывает, как удалить одну неработающую ссылку, но я не могу объединить ее в одну строку. Есть ли для этого однострочный?
Сломанная символика - это ссылка, указывающая на файл/папку, которая больше не существует.
Ответы
Ответ 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
Ответ 3
Ответ основан на принятом ответе на вопрос вопроса "Как найти сломанные символические ссылки" :
find . -type l -! -exec test -e {} \; -print | xargs rm
Ответ 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