Comportement de la commande `du` avec le drapeau` -L`

11

J'ai remarqué un comportement étrange avec la ducommande lorsqu'elle est utilisée avec l' -Loption de ligne de commande.

J'utilise Slackware 14 et Coreutils 8.19.

Pour reproduire l'étrange comportement, créez deux dossiers:

mkdir foo
mkdir bar

Créez un fichier dans l'un des dossiers:

perl -e 'print "A"x10000' > foo/text

Et un lien symbolique dans l'autre dossier:

ln -s ../foo/text bar/text

Maintenant, si vous tapez:

du -h -L bar

Tu auras:

16k bar

Depuis le lien symbolique a été déréférencé. Mais si vous tapez:

du -h -L *

Tu auras:

16K     foo
4.0K    bar

Et le lien symbolique ne sera pas déréférencé. Suis-je en train de manquer quelque chose?

Zagorax
la source
il semble duvouloir jouer intelligemment ici, mais si vous exécutez df -a -L bar foola sortie est très fausse (compter les 16K en barre en laissant foo vide).
guido

Réponses:

18

Par défaut, dune comptera chaque fichier qu'une seule fois s'il est lié plusieurs fois. Si vous l'exécutez, du -L baril comptera le fichier car il ne l'atteint qu'une seule fois. Cependant, si vous l'exécutez, du -L *il ne comptera que la première fois qu'il le verra. Par exemple:

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo

Notez que l'échange de l'ordre des arguments change le dossier qui est signalé comme 16 Ko.

Vous pouvez forcer duà compter le fichier deux fois en passant le -lparamètre.

Éditer:

Les liens symboliques sont un type de fichier spécial et une étape supplémentaire est nécessaire pour suivre le lien. dune suivra pas les liens symboliques à moins que l' -Loption ne soit activée.

Un lien dur, d'autre part, est essentiellement un fichier existant dans deux (ou plusieurs) dossiers. duprésume les fichiers qu'il a vus par numéro d'inode pour éviter de les compter deux fois. -ldésactive ce comportement.

Donc, avec juste -L, il suivra le lien symbolique, mais si le fichier cible a un numéro d'inode, il a déjà vu qu'il ne sera pas recompté. Avec juste, -lil comptera les liens durs en double, mais ne suivra pas les liens symboliques.

Si vous utilisez -let -Lensemble, il suivra à la fois les liens symboliques et permettra également de compter le (s) fichier (s) cible (s) plus d'une fois.

David Baggerman
la source
Je vous remercie. Cela marche. Cependant, j'aimerais avoir des explications supplémentaires. À la page de l' homme, je lis que -lne fait count sizes many times if hard linked, mais ici je travaille avec symlink. De plus, -lseul ne résout pas le problème, alors que si j'utilise les deux -let -Lqu'il compte correctement la taille.
Zagorax
@Zagorax Ouais, la page de manuel n'est pas claire sur la manière -let l' -Linteraction. L'explication est devenue un peu trop longue pour un commentaire, j'ai donc mis à jour ma réponse.
David Baggerman