web-dev-qa-db-fra.com

Comment trouver tous les liens durs dans un dossier?

J'ai deux disques externes qui ont les mêmes fichiers. L'un est crypté, l'autre ne l'est pas. Le crypté a beaucoup moins d’espace disponible que le non crypté, je suppose maintenant que c’est à cause des liens en dur sur les disques non cryptés.

Je voudrais donc vérifier s’il existe des fichiers à liaison fixe qui pourraient être doublés sur le disque chiffré. Comment puis-je identifier un lien dur?

Si vous avez d'autres idées sur la raison du problème de l'espace libre, je suis ouvert aux idées. Est-il possible que les fichiers nécessitent plus d'espace en raison du cryptage?

2
Jeno
$ find -type f -links +1

Cela montrera tous les fichiers ordinaires qui ont plus d’un lien (nom). Il ne vous dira pas quels noms sont liés au même fichier, vous pouvez donc utiliser -samefile ou -inum, par exemple. find -samefile "$somefile"

D'un point de vue technique, tous les fichiers (noms de fichiers) sont des liens (durs). C'est simplement que les fichiers avec plus d'un lien pointant vers eux sont intéressants en ce sens. Mais même dans ces cas, il n’ya aucun moyen de dire que l’un d’eux est le fichier "approprié" et l’autre un lien, les liens sont égaux.

Par exemple:

$ touch a b c
$ ln b b2 ; ln c c2
$ find -type f -links +1
./c2
./b
./b2
./c
$ find -samefile b
./b
./b2
9
ilkkachu

Rechercher des liens durs

Les réponses de @ ilkkachu et de @ barrycarter sont bonnes. Cette réponse est une alternative, qui décrit certains résultats avec plus de détails.

  • Si le {match is lié/les allumettes sont} liés dans la même arborescence, vous les trouverez directement.

  • Sinon, vous pouvez effectuer une recherche dans tout le système de fichiers à partir du point de montage, mais uniquement dans le même système de fichiers à l’aide de -xdev, ce qui est important si vous recherchez la partition racine / et il existe d'autres partitions montées.

    _$ Sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt
    _

Voici un exemple dans lequel une paire liée durement est trouvée dans le répertoire en cours et deux correspondances liées dans un autre répertoire en effectuant une recherche à partir du point de montage _/media/multimed-2_ de la partition de données.

_$ Sudo find . -xdev -type f -links +1 -ls | sort -n
  5242881    648 -rw-rw-r--   2 olle     nio        657936 jun 30  2015 ./like-this.png
  5242882    940 -rw-rw-r--   2 olle     nio        957688 jun 30  2015 ./from-here.png
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./img_4810.jpg
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png
_

Autres causes pour lesquelles une quantité différente d'espace disque est utilisée

  • Différents systèmes de fichiers (ext4, NTFS, FAT32 ...)

  • Une taille de partition différente, ce qui entraîne des différences de temps système (méta-données).

  • Taille de secteur différente sur le lecteur (peut-être?)

5
sudodus

En théorie, les liens physiques ne devraient pas être distingués des fichiers normaux (c'est en quelque sorte le but). Si "x" est un lien dur vers "y", alors "y" est également un lien dur vers "x". Cela étant dit, la deuxième colonne de ls -l vous indique le nombre de liens vers un fichier donné. Si ce nombre est supérieur à 1, le fichier est ou a un lien physique quelque part. Cela peut ne pas fonctionner pour les répertoires, mais je ne sais pas pourquoi. Au départ, je disais que chaque fichier d’un répertoire avait un lien vers ce répertoire, mais j’avais tort: ​​j’ai trouvé un répertoire de 10 fichiers dont le "nombre de liens" n’était que de 2.

Une fois que vous avez trouvé le lien physique, vous pouvez utiliser ls -i pour afficher son inode, puis utiliser l’option inode de find pour rechercher le ou les autres fichiers avec le même inode (ce qui les rend plus liés). L'une et l'autre). Veillez à limiter find à un périphérique spécifique, sinon vous risquez d'obtenir des résultats erronés.

Pour trouver tous les liens durs à la fois, faites en sorte que find crache des inodes pour tous les fichiers d'un périphérique, puis utilisez des objets tels que sort et uniq pour rechercher les doublons.

4
barrycarter

Vous pouvez faire quelque chose comme ça:

find . -type t -ls | grep -v " 1 username"

Cela va lister les fichiers dans le répertoire courant et effectuer un ls dessus. Comme @barrycarter l'a dit, les liens physiques ne peuvent pas être distingués des fichiers réels, mais dans cette liste, ils apparaîtront comme ayant plus d'un lien. En utilisant grep -v vous éliminez les fichiers qui n’ont qu’un seul lien. (La username de la commande grep a pour but de faire en sorte que grep se trouve au bon endroit pour le simple 1. Remplacez-le par votre propre nom d'utilisateur.)

3
Jos