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

Nicolas
la source
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.

Mattias Ahnberg
la source
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».

olegzhermal
la source
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.

cjc
la source
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.

Ragoût
la source
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=-
dsamarin
la source
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}' 
EEAA
la source
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}'

Pradeep
la source