Ich verschiebe häufig Verzeichnisbäume an andere Speicherorte oder kopiere ihre Tarballs auf andere Computer, und ich möchte eine Methode haben, um zu überprüfen, ob Symlinks in einem Verzeichnisbaum A auf Speicherorte außerhalb von A verweisen, da diese beim Verschieben / Kopieren unterbrochen werden Verzeichnis.
8
Verwenden Sie bindfs , um eine weitere Ansicht dieses Verzeichnisbaums zu erstellen.
Verwenden Sie dann das Dienstprogramm symlinks (das von vielen Distributionen geliefert oder aus dem Quellcode kompiliert wird ), um dateisystemübergreifende Links zu erkennen.
(Beachten Sie, dass beim Parsen der Ausgabe davon ausgegangen wird, dass Ihre symbolischen Links und ihre Ziele weder Zeilenumbrüche noch Pfade zu symbolischen Links den Teilstring enthalten
->
.) Mit demselben Dienstprogramm können auch absolute Symlinks in relative konvertiert werden (dies möchten Sie jedoch von) der ursprüngliche Ort).quelle
Mit zsh:
Wenn das Verzeichnis ist
/foo
und Sie haben,/foo/bar
dass es sich um einen Symlink/foo/baz
handelt, ist dies ein Link, dessen Ziel sich in / foo befindet, aber nach dem Verschieben wird der Link immer noch unterbrochen, sodass Sie möglicherweise auch Symlinks mit absoluten Pfaden abgleichen möchten.Aber selbst dann ein
bar => ../foo/baz
in/foo
würde ein Problem (falsch negativ) sein, würde so ein ,a => b
wob
ein symbolischen Link außerhalb des Baumes (falsch positiv, je nachdem wie man es sehen will)quelle
Ich musste die Antwort von @bahamat ein wenig optimieren, damit es funktioniert.
Die bereitgestellte Version meldete lediglich den beleidigenden absoluten Ort, nicht jedoch den Symlink, der darauf verweist.
Folgendes habe ich verwendet (ich bin sicher, dass es verbessert werden kann):
quelle
for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"
(vor allem-m
und-q
das defekte und nicht externe Links herausfiltert)GNU Coreutils hat bewiesen
realpath
, dass Symlinks aufgelöst werden. Auf diese Weise können Sie das Ziel jedes Symlinks mit dem aktuellen Arbeitsverzeichnis vergleichen.quelle
-type l
, keine-r
Optionread
, IFS nicht bereinigtread
,$filename
nicht zitiert,$PWD
als regulärer Ausdruck behandelt, Pfade mit Zeilenumbruchzeichen, die nicht berücksichtigt wurden,/foobar
würden für$PWD
== "/ foo"