Comment afficher uniquement la taille totale du fichier d'une extension particulière par la commande `du`

11

J'ai des centaines de fichiers pdf et html dans un répertoire. Et je veux connaître la taille totale des fichiers pdf.

Par commande, du -ch /var/fooje peux voir la taille totale du fichier mais je n'ai besoin que de la dernière ligne, la taille totale.

Si le répertoire ne contient que des fichiers pdf, je peux utiliser l' -soption, mais l'option ne peut pas être utilisée cette fois.

Comment puis-je obtenir uniquement la taille totale d'un type de fichier particulier?

fer à repasser
la source
Vous ne pouvez pas utiliser comme ça du -sh /foo/*.pdf?
bagavadhar
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Réponses:

10

Avec GNU du(c'est-à-dire sur Linux non intégré ou Cygwin), vous pouvez utiliser l' --excludeoption pour exclure les fichiers que vous ne souhaitez pas faire correspondre.

du -s --exclude='*.html' /var/foo

Si vous souhaitez faire correspondre positivement les *.pdffichiers, vous devrez utiliser une autre méthode pour répertorier les fichiers et duafficher au moins une ligne de sortie par argument, plus un grand total avec l'option -c. Vous pouvez appeler tailpour supprimer toutes les lignes sauf la dernière, ou sed pour supprimer également le mot «total». Pour énumérer les fichiers de ce répertoire, utilisez des caractères génériques dans le shell.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

Si vous devez également parcourir des fichiers dans des sous-répertoires, utilisez findou utilisez un **/modèle si votre shell le prend en charge. Pour **/, dans bash, lancez d'abord shopt -s extglob, et notez que les versions bash jusqu'à 4.2 traverseront des liens symboliques vers des répertoires; en zsh, cela fonctionne hors de la boîte.

du -sc /var/foo/**/*.pdf | tail -n1

Une complication supplémentaire avec la version find est que s'il y a trop de fichiers, finds'exécutera duplus d'une fois, pour rester sous la limite de longueur de ligne de commande. Avec la méthode des caractères génériques, vous obtiendrez une erreur si cela se produit («limite de longueur de ligne de commande dépassée»). Le code suivant suppose que vous n'avez aucun nom de fichier correspondant contenant une nouvelle ligne.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Gilles 'SO- arrête d'être méchant'
la source
(probablement pas un problème dans la pratique, mais notez que --exclude='*.html'cela /var/foo/dir.html/foo.pdfne serait pas pris en compte car les exclusions affectent également la traversée des répertoires; aussi, l'utilisation du disque des répertoires, y compris /var/foolui-même, serait prise en compte)
Stéphane Chazelas
3

Vous pouvez laisser le shell développer les fichiers:

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

Cependant, comme vous pouvez le voir, cela indique que la taille des fichiers est environ 1000 fois celle qui vient d'être créée. Une meilleure option utilise l' -boption:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

Les fichiers de grande taille seront toujours affichés sous une forme lisible par l'homme, par exemple 173K.

Anthon
la source
dumontre l'utilisation du disque de chaque fichier (sur la plupart des systèmes de fichiers, c'est la taille du fichier arrondie au multiple suivant de la taille du bloc). Avec l'option -b, duaffiche la taille de chaque fichier.
Gilles 'SO- arrête d'être méchant'