Chciałbym zdecydowanie sugerują, nie używać find -L
do tego zadania (patrz poniżej dla wyjaśnienia). Oto kilka innych sposobów, aby to zrobić:
Jeśli chcesz użyć find
metody „czystej ”, powinna ona wyglądać następująco:
find . -xtype l
( xtype
jest to test przeprowadzony na dereferencyjnym łączu). Może to nie być dostępne we wszystkich wersjach find
. Ale są też inne opcje:
Można również exec test -e
z poziomu find
polecenia:
find . -type l ! -exec test -e {} \; -print
Nawet jakaś grep
sztuczka mogłaby być lepsza (tj. Bezpieczniejsza ) niż find -L
, ale nie dokładnie taka jak przedstawiona w pytaniu (która grepuje w całych liniach wyjściowych, w tym nazwach plików):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
find -L
Trik cytowany przez solówki z commandlinefu wygląda ładnie i hacky, ale ma jedną bardzo niebezpieczne pułapki : Wszystkie dowiązania są przestrzegane. Rozważ katalog z zawartością przedstawioną poniżej:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Jeśli uruchomisz find -L . -type l
ten katalog, /usr/share/
przeszukane zostaną również wszystkie (i może to potrwać naprawdę długo) 1 . W przypadku find
polecenia „odpornego na linki wychodzące” nie używaj-L
.
1 Może to wyglądać na niewielką niedogodność (polecenie „po prostu” zajmie całe przejście /usr/share
), ale może mieć poważniejsze konsekwencje. Rozważmy na przykład środowiska chroot: mogą istnieć w pewnym podkatalogu głównego systemu plików i zawierać dowiązania symboliczne do absolutnych lokalizacji. Te linki mogą wydawać się zepsute w systemie „zewnętrznym”, ponieważ wskazują na właściwe miejsca dopiero po wejściu do chroot. Pamiętam również, że niektóre bootloadery używały dowiązań symbolicznych w /boot
tym sensie tylko w początkowej fazie rozruchu, kiedy partycja rozruchowa została zamontowana jako /
.
Jeśli więc użyjesz find -L
polecenia, aby znaleźć, a następnie usunąć uszkodzone dowiązania symboliczne z jakiegoś nieszkodliwego katalogu, możesz nawet uszkodzić system ...
-type l
jest zbędny, ponieważ-xtype l
będzie działał jak-type l
na nie-linkach. Więcfind -xtype l
to chyba wszystko, czego potrzebujemy. Dzięki za to podejście./proc/XXX/exe
link nie jest uszkodzony. W tym celu użyjtest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
oznacza „znajdź wszystkie dowiązania symboliczne, których (docelowymi) plikami docelowymi są dowiązania symboliczne”. Ale ostatecznym celem dowiązania symbolicznego nie może być dowiązanie symboliczne, w przeciwnym razie nadal możemy podążać za dowiązaniem i nie jest to cel ostateczny. Ponieważ nie ma takich dowiązań symbolicznych, możemy zdefiniować je jako coś innego, tj. Zepsute dowiązania symboliczne.l
, jest dla mnie mniej mylące.-L
hacka, ale raczej (ślepo) usuwania zepsutych dowiązań symbolicznych w ogóle.symlinks
Polecenie od http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz mogą być wykorzystane do identyfikacji dowiązania z różnych cechach. Na przykład:źródło
symlinks
jest wstępnie zainstalowany na Fedorze.Jak już komentował rozcietrzewiacz,
find -L
może mieć nieoczekiwaną konsekwencję rozszerzenia wyszukiwania na katalogi dowiązane, więc nie jest to optymalne podejście. Nikt jeszcze o tym nie wspominałto bardziej zwięzłe i logicznie identyczne polecenie
Żadne z przedstawionych dotychczas rozwiązań nie wykryje cyklicznych dowiązań symbolicznych, co jest innym rodzajem uszkodzenia. to pytanie dotyczy przenośności. Podsumowując, przenośnym sposobem na znalezienie uszkodzonych dowiązań symbolicznych, w tym łączy cyklicznych, jest:
Aby uzyskać więcej informacji, zobacz to pytanie lub ynform.org . Oczywiście ostatecznym źródłem tego wszystkiego jest dokumentacja findutils .
źródło
find -L
także linkami cyklicznymi. +1-xtype
nie jest określone w POSIX i rzeczywiście, jeśli spojrzysz nafind(1)
macOS, to ma,-type
ale nie ma-xtype
.Wierzę, że dodanie
-L
flagi do twojego polecenia pozwoli ci pozbyć się grep:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
od mężczyzny:
źródło
Jeśli potrzebujesz innego zachowania, niezależnie od tego, czy link jest zepsuty czy cykliczny, możesz również użyć% Y z funkcją find:
Ten przykład został skopiowany z tego postu (witryna usunięta) .
Odniesienie
źródło
find
komenda nie obsługujextype
mogą pochodzić z tego:find . type l -printf "%Y %p\n" | grep -w '^N'
. Kiedy Andy pobił mnie tym samym (podstawowym) pomysłem w swoim skrypcie, niechętnie pisałem go jako osobną odpowiedź. :)Używam tego do mojego przypadku i działa całkiem dobrze, ponieważ znam katalog do wyszukiwania uszkodzonych dowiązań symbolicznych:
a mój folder zawiera link do,
/usr/share
ale go nie przechodzi. Łącza między urządzeniami i te, które są ważne dla chrootów itp., Wciąż stanowią pułapkę, ale w moim przypadku jest wystarczająca.źródło
Prosta odpowiedź bez zastanowienia, która jest odmianą wersji OP. Czasami chcesz po prostu coś łatwego do wpisania lub zapamiętania:
źródło
find -L . -type l |xargs symlinks
poda informacje, czy link istnieje, czy nie, na podstawie znalezionego pliku.źródło
Spowoduje to wydrukowanie nazw uszkodzonych dowiązań symbolicznych w bieżącym katalogu.
Działa w Bash. Nie wiem o innych pociskach.
źródło