Me gustaría convertir recursivamente enlaces blandos a enlaces duros en un directorio. He intentado algo como esto:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
... pero tiene dos problemas principales:
- no recursivo
- recoge archivos que no son enlaces simbólicos
Sería bueno alimentar de alguna manera la línea anterior find -type l
, pero no estoy seguro de cómo hacerlo.
bash
find
symbolic-link
Atila O.
fuente
fuente
cp -aH
). [1]: unix.stackexchange.com/questions/94185/…Respuestas:
Este comando debería funcionar:
Cómo funciona:
find -type l
encuentra todos los enlaces en el directorio actual.-exec bash -c '...' {} \;
invoca bash para ejecutar...
.Pasa
{}
, el nombre del enlace que se está procesando actualmente, como un argumento, al que bash puede acceder como$0
.readlink -m "$0"
devuelve la ruta absoluta del destino del enlace simbólico.ln -f "$(readlink -m "$0")" "$0"
sobrescribe (-f
) el enlace simbólico$0
con un enlace duro a su objetivo.Si el enlace no se puede convertir por algún motivo, permanecerá intacto e imprimirá un mensaje de error.
fuente
bash
yln
?-e
interruptor lo soluciona.brew install coreutils
yfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.