Si j'ai bien compris le -L
drapeau des cp
La commande devrait faire exactement ce que vous voulez.
Copiez simplement tous les liens symboliques et il les remplacera par les fichiers vers lesquels ils pointent.
Il serait peut-être plus simple d'utiliser simplement tar pour copier les données dans un nouveau répertoire.
-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.
Vous pourriez utiliser quelque chose comme ça
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
Pour quelques définitions de "facile":
#!/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
Exécutez ce script avec des noms de liens comme arguments, par ex. à find . -type l -exec /path/tos/script {} +