Dateien nach Symlink-Ziel auflisten


23

Wie erhalte ich eine Dateiliste (und mache dann etwas mit dieser Liste), indem ich nach dem symbolischen Link- Zielnamen und nicht nach dem Symlink-Namen filtere? Zum Beispiel aus der folgenden Liste interessiere ich mich nur für die ersten vier Dateien (Ziel enthält bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

Antworten:


31

Mit find können Sie alle Dateien vom Typ symlink abrufen und die -ilnameOption hinzufügen , nach dem Namen des Verknüpfungsziels zu suchen. Dies funktioniert genauso, -inamenur für den Linkzielnamen anstelle des Linknamens.

find -type l -ilname "*bar*"

Der Name des Links wird weiterhin ausgedruckt, nicht das Ziel. Wenn Sie die Namen der Ziele drucken möchten, versuchen Sie Folgendes:

find -type l -ilname "*bar*" -printf "%l\n"

Oder erhalten Sie eine vollständige lsStilausgabe

find -type l -ilname "*bar*" -ls

Was Sie unter " Mit der Liste etwas anfangen" verstehen, ist unklar. Wenn Sie jedoch die Verknüpfungsdateien bearbeiten möchten, können Sie das folgende -execArgument verwenden:

find -type l -ilname "*bar*" -exec touch {} \;

Wenn Sie jedoch die Verbindungsziele bearbeiten müssen, müssen Sie die verwenden -printf, um die Zielwerte abzurufen, und dann xargsoder eine andere Schleife selbst ausführen. Sie könnten so etwas tun:

find -type l -printf "%l\n" | grep bar | xargs touch

... das auch zeigt, wie man grepanstelle des find -ilnameNamensvergleichs verwendet, obwohl man das auch so machen kann.


danke Caleb! Sie haben meine sofortige Frage vollständig beantwortet und einige Seitenkanalfälle behandelt, die ich auf jeden Fall auch verwenden werde.
Matt Wilkie

1
find /dev/disk/ -type l -ilname "*sde*"Irgendeine Idee, warum das nicht funktioniert?
Aquarius Power

Benötigt GNU find.
Ceving
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.