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
Matt Wilkie
quelle

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.

Caleb
quelle
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