Existe-t-il un moyen simple de trouver tous les fichiers épars sur mon système ou dans une arborescence de répertoires particulière?
Si cela est pertinent, j'utilise zsh
sur Ubuntu 12.04, bien qu'une réponse Unix-y plus générique pour bash / sh, par exemple, conviendrait.
Edit : pour clarifier, je cherche à rechercher des fichiers clairsemés, pas à vérifier l'état de clarté d'un seul.
filesystems
files
Andrew Ferrier
la source
la source
Réponses:
Sur les systèmes (et systèmes de fichiers) prenant en charge l'
SEEK_HOLE
lseek
indicateur (comme le ferait votre Ubuntu 12.04 sur ext4) et supposant que la valeur deSEEK_HOLE
est 4 comme sur Linux:Cette syntaxe shell est POSIX. Les trucs non portables sont dedans
perl
et çaSEEK_HOLE
.lseek(SEEK_HOLE)
cherche au début du premier trou dans le fichier, ou à la fin du fichier si aucun trou n'est trouvé. Ci-dessus, nous savons que le fichier n'est pas rare lorsque lelseek(SEEK_HOLE)
nous amène à la fin du fichier (au même endroit quelseek(SEEK_END)
).Si vous souhaitez répertorier les fichiers épars:
Le GNU
find
(depuis la version 4.3.3) doit-printf %S
signaler la rareté d'un fichier. Il adopte la même approche que la réponse de frostschutz en ce qu'il prend le rapport entre l'utilisation du disque et la taille du fichier, il n'est donc pas garanti de signaler tous les fichiers épars (comme lorsqu'il y a compression au niveau du système de fichiers ou lorsque l'espace économisé par les trous ne le fait pas). compenser la surcharge de l'infrastructure du système de fichiers ou les grands attributs étendus), mais fonctionnerait sur des systèmes qui n'en ont pasSEEK_HOLE
ou sur des systèmes de fichiers où ilSEEK_HOLE
n'est pas implémenté. Ici avec les outils GNU:(notez qu'une version antérieure de cette réponse ne fonctionnait pas correctement lorsqu'elle
find
exprimait la rareté comme par exemple 3.2e-05. Merci à la réponse de @ flashydave de l' avoir portée à mon attention)la source
find
devrait également exclure purement et simplement les fichiers de 0 octet?find -printf '%S'
! :-)tr
commande parxargs -r0 rm -f
Un fichier est généralement clairsemé lorsque le nombre de blocs alloués est inférieur à la taille du fichier (en utilisant ici GNU
stat
comme on le trouve sur Ubuntu, mais attention, d'autres systèmes peuvent avoir des implémentations incompatibles destat
).Variante avec
find
: (volé à Stéphane)Vous placez généralement cela dans un script shell à la place, puis exécutez le script shell.
la source
SEEK_HOLE
est tout aussi problématique, car il n'est pas pris en charge par de nombreuses plates-formes / systèmes de fichiers. Sous Linux, vous pouvez également utiliserFIEMAP
/FIBMAP
, maisFIBMAP
en particulier, c'est horriblement lent ... il ne semble tout simplement pas être un bon moyen.for file in *
oufind
. Si vous pouvez tester un seul fichier, vous pouvez tester tous les fichiers ... bien que vous deviez exclure les répertoires avec cette méthode.La réponse de Stephane Chazelas ci-dessus ne prend pas en compte le fait que certains fichiers clairsemés avec le paramètre find% S rapportent le rapport sous forme de nombres à virgule flottante comme
Ceux-ci peuvent être trouvés en plus avec
la source
Un court script que j'ai écrit en essayant de savoir quels sont les emplacements des trous dans un fichier:
Cela imprime des trucs comme:
la source