¿Cómo eliminar enlaces duros en Ubuntu sin perder el archivo original?

¿Cómo eliminar enlaces duros en Ubuntu sin perder el archivo original?

Estoy en ubuntu y uso dropbox. El problema es que tengo algunos problemas de sincronización porque tengo muchos enlaces físicos en mi carpeta de imágenes.

¿Cómo puedo eliminarlos todos con un simple comando SIN perder ninguna imagen? Para un solo archivo he encontrado el comando fluido

find /home -xdev -samefile "filename" | xargs rm

¿Pero no sé cómo hacerlo para todos los archivos?

gracias de antemano

Información sobre mi sistema de archivos:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

Respuesta1

Puede eliminar un archivo siempre que haya más de un enlace físico a él; los datos se eliminarán cuando se elimine el último enlace físico. La cantidad de enlaces se puede recuperar con stat -c '%h' {file}(*), por lo que puede borrar todos los archivos que tengan más de un enlace físico, algo como esto:

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

Como dicen,al final solo habrá uno, y el superviviente será el último en comprobarse, dependiendo del orden de procesamiento del directorio, orden alfabético, etc...

(*) También aparece en la salida de ls -l, pero esto es más difícil de analizar...

Respuesta2

puedes eliminar"extra"copias de todos los archivos como este:

find /home -xdev -type f -links +1 -delete

pero debe tener en cuenta que algunas de esas copias adicionales pueden estar vinculadas a lugares externos/home(y puede parecer que falta).

El-links +1le indica findque seleccione solo los archivos ( -type f) que tienen más de un enlace físico.

Podría (con más trabajo) utilizar findpara imprimir el valor de inodo para cada archivo y ordenar el resultado y (con awk) escribir una lista de archivos para eliminar a través de xargs, pero hacerlo tendría problemas con nombres de archivos con caracteres especiales (incluidos los espacios en blanco). Pero así sería como eliminar la sorpresa cuando un archivo está vinculado fuera/home.

Respuesta3

En Unix/Linux/MacOS, un nombre de archivo en un directorio hace referencia a un inodo (nodo indirecto), que es la estructura en el disco queen realidades el archivo. Esta asociación de un nombre con un inodo se llamaenlace duroen contraposición a unenlace suaveeso es esencialmente solo un archivo que contiene el nombre bajo el cual se puede encontrar el archivo. Los enlaces blandos pueden romperse si se cambia el nombre o se elimina alguna parte de la ruta al archivo vinculado, mientras que cambiar el nombre o mover un enlace físico no afecta a los demás en absoluto.

Por lo tanto, no existe un "archivo original",todoLos enlaces físicos tienen exactamente el mismo estado. El inodo registra cuántos enlaces físicos hacen referencia al archivo ( ls -lmuestra este número como segundo campo; generalmente es 1 para archivos (solo un enlace) y 2 para directorios (el enlace en el padre y '.' en el directorio en sí; si hay subdirectorios, cada uno se refiere a su padre mediante '..' y, por lo tanto, el recuento aumenta). El espacio utilizado por el archivo se recupera cuando el recuento de enlaces llega a 0.

información relacionada