Frage Wie löst man alle symbolischen Links in einem Verzeichnis auf?


Ich versuche, ein Debian-Paket von Upstream-Quellcode zu machen, der nicht mir gehört. Das configure Das vom Autor bereitgestellte Skript erstellt viele symbolische Links im Quellverzeichnis. Sie sind Symlinks zu allen Headern in src Unterverzeichnis zu include Subdir (Damit kann Makefile die include Verzeichnis im Falle der Installation des Entwicklungspakets). Ich benutze debhelper Skripte, um ein Paket zu erstellen.

Ich benutze debhelper Skripte, um ein Paket zu erstellen. Das Problem besteht darin, ein neues Debian-Paketformat zu verwenden (quilt 3.0 native), debuild weigert sich, Änderungen des Quellverzeichnisses, bestehend aus Symlinks, auf final zu setzen diff Datei. Ich bekomme Fehler wie folgt:

dpkg-source: error: cannot represent change to foo.h:
dpkg-source: error:   new version is symlink to /ba/foo/foo.h
dpkg-source: error:   old version is nonexistent

Ich bin mir der guten Lösung bewusst: Ändern Sie configure script, um überhaupt keinen Header zu symbolisieren. Es sollte ein Ziel hinzufügen makefile installieren devel Paket. Obwohl das Konfigurationsskript Copyright-Probleme aufweist. Ich kann die Upstream-Quelle nicht berühren.

Ich suche nach einem Bash-Skript, um alle Symlinks in einem Verzeichnis durch tatsächliche Dateien zu ersetzen, auf die sie verweisen. Zum Beispiel wenn im Verzeichnis d Es gibt drei Dateien a und b und c, zu denen sie Symlinks einnahmen ../../foo/bar/x, ../../foo/bar/z  ../../foo/bar/yAusführen des gewünschten Skripts magic.sh) geben ./d als erstes Argument, sollte

cp ../../foo/bar/x ./d/a
cp ../../foo/bar/y ./d/b
cp ../../foo/bar/z ./d/c

Ich kann keine Möglichkeit finden, zu wissen, auf welche Datei ein Symlink verweist.


4
2017-09-18 17:52


Ursprung




Antworten:


Benutzen readlink.

$ readlink /etc/alternatives/editor
/usr/bin/vim.basic

und wickle es in ein Shell-Skript, das über die symbolischen Links im Verzeichnis läuft.

Sie können symbolische Links mit finden find:

$ find . -type l

Ein vollständigeres Beispiel:

#!/bin/bash

find . -maxdepth 1 -type l | while read LINE; do 
echo link: $LINE resolved: `readlink $LINE`
done

Ausgänge

link: ./.remmina resolved: sparkleshare-homedir/remmina
link: ./project resolved: Documents/2011-2 Project/
link: ./.ssh resolved: sparkleshare-homedir/ssh

4
2017-09-18 17:57



pastebin.com/FNWQAsbm Ich hoffe, das funktioniert für mich ... - sorush-r
Funktioniert gut ... danke :) - sorush-r
Achten Sie darauf, bei Operationen ordnungsgemäß zu entkommen. Ein Symlink löst auf bla / bla kann zu diesem erweitern: rm -rf bla / bla. Nicht sicher, ob dein Beispiel dies verhindert, meins nicht. - gertvdijk