Usando rdfind
encontré muchos archivos vinculados (~ 60-90) y quiero desvincularlos todos. Una posible solución es simplemente buscar todos los archivos -link +1
y copiarlos, eliminarlos y moverlos nuevamente al nombre del enlace.
¿Existe una solución mejor? ¿Hay alguna forma más fácil de hacer esto?
Respuesta1
Tu puedes hacer:
find . -type f -links +1 -exec sh -c '
{ rm -f "$1" && cat > "$1"; } < "$1"' sh {} \;
pero eso no preservará los metadatos del archivo. En Linux, puedes hacer en su lugar:
find . -type f -links +1 -exec sh -c '
{ rm -f "$1" && cp -p /proc/self/fd/0 "$1"; } < "$1"' sh {} \;
Tenga en cuenta que si cat
falla cp
(como si el disco está lleno), perderá el contenido del archivo que cat
no cp
logré copiar.
Usamos -exec {} \;
en lugar de -exec {} +
para que el recuento de enlaces del archivo se actualice después de que se haya encontrado el archivo, de modo que find
noencontrarel último enlace si el recuento de enlaces se ha reducido a 1 (lo que significa que para un archivo con un recuento de enlaces inicial de 4, solo se sobrescribirán 3 instancias).
Con GNU tar
, también puedes hacer:
find . -type f -links +1 -print0 |
tar --hard-dereference --null -T - -cf - | tar xpf -
Eso ejecutará menos comandos pero sobrescribirá más archivos.
Es posible que veas algunos:
tar: ./file: file changed as we read it
para archivos grandes, pero está bien ya que el segundo tar
desvinculará el archivo antes de sobrescribirlo, por lo que será muy similar al primer enfoque. Es solo el primero tar
en notar que el recuento de enlaces disminuye (y el tiempo cambia como resultado) cuando el segundo tar desvincula el archivo.