¿Cuál es la mejor manera de desvincular archivos vinculados?

¿Cuál es la mejor manera de desvincular archivos vinculados?

Usando rdfindencontré 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 catfalla cp(como si el disco está lleno), perderá el contenido del archivo que catno cplogré 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 findnoencontrarel ú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 tardesvinculará el archivo antes de sobrescribirlo, por lo que será muy similar al primer enfoque. Es solo el primero taren notar que el recuento de enlaces disminuye (y el tiempo cambia como resultado) cuando el segundo tar desvincula el archivo.

información relacionada