Wenn ich dich richtig verstanden habe der -L
Flag der cp
Befehl sollte genau das tun, was Sie wollen.
Kopieren Sie einfach alle symbolischen Links und sie werden durch die Dateien ersetzt, auf die sie verweisen.
Es könnte einfacher sein, einfach tar zu verwenden, um die Daten in ein neues Verzeichnis zu kopieren.
-H (c and r mode only) Symbolic links named on the command line will be followed; the target of the link will be archived, not the link itself.
Sie könnten so etwas verwenden
tar -hcf - sourcedir | tar -xf - -C newdir
tar --help:
-H, --format=FORMAT create archive of the given format
-h, --dereference follow symlinks; archive and dump the files they point to
Für einige Definitionen von "einfach":
#!/bin/sh
set -e
for link; do
test -h "$link" || continue
dir=$(dirname "$link")
reltarget=$(readlink "$link")
case $reltarget in
/*) abstarget=$reltarget;;
*) abstarget=$dir/$reltarget;;
esac
rm -fv "$link"
cp -afv "$abstarget" "$link" || {
# on failure, restore the symlink
rm -rfv "$link"
ln -sfv "$reltarget" "$link"
}
done
Führen Sie dieses Skript mit Linknamen als Argumente aus, z. bis find . -type l -exec /path/tos/script {} +