Obtenir la taille totale des fichiers à partir d'un fichier contenant une liste de fichiers


14

J'ai un fichier contenant une liste de fichiers dont j'aimerais connaître la taille totale des fichiers. Existe-t-il une commande pour le faire?

Mon OS est un linux très basique (Qnap TS-410).

ÉDITER:

Quelques lignes du fichier:

/ share / archive / Test Bailey / BD006 / 0.tga
/ share / archive / Bailey / BD007 / 1 version 1.tga
/ share / archive / Bailey 2 / BD007 / example.tga


Donnez-nous quelques exemples de lignes du fichier.
EEAA

Exemple du fichier ajouté.
Nicolas

C'est une sorte de NAS, non? Avez-vous installé busybox?
cjc

Oui et je pense qu'il est déjà installé, pourquoi?
Nicolas

Réponses:


13

Je crois que quelque chose comme ça fonctionnerait dans busybox:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

Je n'ai pas le même environnement que vous, mais si vous rencontrez des problèmes avec les espaces dans les noms de fichiers, quelque chose comme ça fonctionnerait aussi:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

Edit 1 :
@stew est juste dans son article ci-dessous, du montre l'utilisation du disque et non la taille exacte du fichier. Pour changer le comportement, busybox utilise l'indicateur -a, alors essayez: du -a "$file"pour une taille de fichier exacte et comparez la sortie / le comportement.


1
Merci pour votre contribution, la première commande revient /usr/bin/du: Argument list too long(près de 80 000 lignes dans mon fichier). Votre deuxième commande me donne juste une invite une fois que j'appuie sur Entrée, en attendant quelque chose de plus?
Nicolas

Difficile à dire avec votre environnement. S'agit-il de l'invite de commande normale ou simplement d'une invite clignotante? Si c'est le dernier, il pourrait être lent à attendre le résultat, si c'est une "invite de saisie", c'est peut-être que vous avez manqué un caractère? Et si c'est une invite normale, je ne sais pas, je l'ai testée de manière assez approfondie avant de la taper. :(
Mattias Ahnberg

c'est une "invite de saisie" lorsque je fais ce qui suit cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'. merci mattias
Nicolas

1
Ah! Si vous mettez tout sur une ligne, vous en avez besoin d'une autre; comme ceci: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(c'est à dire avant de faire).
Mattias Ahnberg

Spot on! Cela a fonctionné parfaitement, bravo! (même si j'aurais pu comprendre cette erreur par moi-même)
Nicolas

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-cajoute la ligne "taille totale";
tail -1prend la dernière ligne (avec la taille totale);
cut -f 1supprime le mot «total».


Cela échoue avec la liste des arguments trop longue. Ma liste de fichiers est grande. La réponse ci-dessous avec xargs semble être la solution la plus simple.
Syclone0044

4

Je ne sais pas si vos outils Linux sont capables de cela, mais:

cat /tmp/filelist.txt  |xargs -d \\n du -c

Faites, les xargs définiront le délimiteur comme un caractère de nouvelle ligne, et du produira un grand total pour vous.

En regardant http://busybox.net/downloads/BusyBox.html, il semble que "busybox du" supporte l'option grand total, mais les "xboxs busybox" ne prennent pas en charge les délimiteurs personnalisés.

Encore une fois, je ne suis pas sûr de votre ensemble d'outils.


voici le résultat:xargs: invalid option -- d
Nicolas

Génial: travailler avec le linux occupé d'une NAS, c'est comme un épisode McGuyver, essayer de construire un avion qui fonctionne à partir de toile, de bâtons et de ficelle.
cjc

Que diriez-vous de cela, si vous avez de la place pour cela sur une autre machine: copiez tous les fichiers qui vous intéressent dans un autre linux entièrement fonctionnel, puis exécutez la solution de Stew là-bas. Cela pourrait être beaucoup plus facile que d'essayer de déterminer si la boîte occupée est capable de ce genre de chose.
cjc

1
Je pense que la réponse est la meilleure. Il est concis et beaucoup plus rapide que les autres réponses de ce fil.
zymhan

Bonne réponse. Vous voudrez peut-être laisser de côté -ccar xargs fera plusieurs appels à dusi la liste de fichiers est suffisamment longue, produisant plusieurs dutotaux.
qwr

4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

Ceci est similaire à la solution de Mattias Ahnberg. L'utilisation de "read" résout les problèmes de noms de fichiers / répertoires avec des espaces. J'utilise statau lieu de dupour obtenir la taille du fichier. du obtient la quantité d'espace qu'il utilise sur le disque au lieu de la taille du fichier, qui peut être différente. Selon votre système de fichiers, un fichier de 1 octet occupera toujours 4k sur le disque (ou quelle que soit la taille de bloc). Donc, pour un fichier de 1 octet, stat indique 1 octet et du dit 4k.


Bon commentaire sur la taille de fichier vs la taille de disque!
Mattias Ahnberg

Commentaire très intéressant en effet, malheureusement mon linux ne connaît pas la statcommande:stat: command not found
Nicolas

Vous devrez peut-être dire "busybox stat".
cjc

il est dit stat: applet not founddans ce cas
Nicolas

4

Voici une autre solution au problème:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

Pour moi (sur cygwin) ça du -bctourne beaucoup plus vite.
qwr

2

Essayez quelque chose comme ceci:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

Pour gérer correctement les espaces dans les chemins:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

merci pour votre contribution, malheureusement je pense qu'il y a un problème avec les espaces dans les répertoires de mon fichier qui ne sont pas échappés par un "\". Par conséquent, il se casse en parcourant la liste des fichiers.
Nicolas

Pouvez-vous contourner la liste des fichiers texte et simplement générer cela à partir de la sortie de find?
EEAA

malheureusement la liste est trop longue, il y a 79159 lignes de fichiers (chemin complet), c'est pourquoi je les exporte dans un fichier; peut-être puis-je ajouter un argument pour échapper au résultat de la recherche?
Nicolas

il n'y a pas d'argument "-print0" avec la recherche sur mon système Linux
Nicolas

@Nicolas - cela est dû au fait qu'il utilise la suppression de busybox au findlieu du vrai findbinaire.
EEAA

1

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.