Ich möchte rekursiv Softlinks in Hardlinks in einem Verzeichnis konvertieren. Ich habe so etwas ausprobiert:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
… Aber es gibt zwei Hauptprobleme:
- nicht rekursiv
- nimmt Dateien auf, die keine symbolischen Verknüpfungen sind
Es wäre schön, die obige Zeile irgendwie zu füttern find -type l
, aber ich bin mir nicht sicher, wie ich das machen soll.
bash
find
symbolic-link
Attila O.
quelle
quelle
cp -aH
). [1]: unix.stackexchange.com/questions/94185/…Antworten:
Dieser Befehl sollte funktionieren:
Wie es funktioniert:
find -type l
findet alle Links im aktuellen Verzeichnis.-exec bash -c '...' {} \;
ruft bash zur Ausführung auf...
.Es übergibt
{}
- den Namen des Links, der gerade verarbeitet wird - als Argument, auf das die Bash zugreifen kann$0
.readlink -m "$0"
Gibt den absoluten Pfad des Ziels der symbolischen Verknüpfung zurück.ln -f "$(readlink -m "$0")" "$0"
überschreibt (-f
) den symbolischen Link$0
mit einem festen Link zu seinem Ziel.Wenn der Link aus irgendeinem Grund nicht konvertiert werden kann, bleibt er unberührt und ln gibt eine Fehlermeldung aus.
quelle
bash
und anzugebenln
?-e
Schalter behebt das.brew install coreutils
undfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.