Obtenir la taille totale d'une liste de fichiers sous UNIX
Je veux exécuter un find
de commande qui vous permettra de trouver un certain liste de fichiers, puis parcourir la liste de fichiers pour exécuter certaines opérations. Je tiens également à trouver la taille totale de tous les fichiers dans la liste.
Je voudrais faire la liste de fichiers, puis de faire d'autres opérations. Est-il un moyen facile pour que je puisse juste la taille totale de tous les fichiers dans la liste?
En essence je suis en train d'essayer de trouver un one-liner pour le " total_size variable dans l'extrait de code ci-dessous:
#!/bin/bash
loc_to_look='/foo/bar/location'
file_list=$(find $loc_to_look -type f -name "*.dat" -size +100M)
total_size=???
echo 'total size of all files is: '$total_size
for file in $file_list; do
# do a bunch of operations
done
- Vous pouvez utiliser
printf "%p %s\n"
dans votrefind
commande pour afficher le nom + la taille. - Si sa version de
find
prend en charge-printf
. Une certaine forme de-exec stat -f '%z' {} \;
(en fonction de la mise en œuvre du système destat
) marcherait aussi bien. - aussi, vous auriez alors à répartir les noms de fichiers et tailles avant la boucle for...
- Stocker une liste de noms de fichiers dans un plat chaîne n'est pas recommandé de toute façon, puisque vous ne pouvez pas faire face avec les noms de fichiers contenant des espaces facilement.
Vous devez vous connecter pour publier un commentaire.
Vous devez simplement être en mesure de passer
$file_list
àdu
:du
options:-c
afficher un total-h
lisible par un humain (c'est à dire 17M)du
va imprimer une entrée pour chaque fichier, suivi par le total (avec-c
), nous utilisons donc destail -1
de couper seulement la dernière ligne etcut -f 1
de couper cette ligne de la première colonne.du
tirages réels de l'utilisation du disque arrondi à un multiple de (généralement) de 4 KO au lieu de la logique de la taille du fichier.for i in {0..9}; do echo -n $i > $i.txt; done; du -ch *.txt
=>40K total
au lieu de10 total
.du
. Si vous utilisez les outils GNU, vous pourriez être en mesure d'ajouter--apparent-size
à ladu
options pour obtenir la même taille que l'inscriptionls
affiche.\
mais pas de chance.--apparent-size
?Les méthodes expliquées ici ont caché bug. Lorsque le fichier de la liste est long, il dépasse la limite de shell comand taille. Mieux l'utiliser à l'aide du:
trouver produit null terminé la liste des fichiers du prend à partir de stdin et de comtes.
ceci est indépendant du shell de commande de limite de taille.
Bien sûr, vous pouvez ajouter du certains commutateurs pour obtenir des logiques de taille de fichier, car, par défaut, du vous a dit comment la physique de l'espace de fichiers.
Mais je pense qu'il n'est pas question pour les programmeurs, mais pour unix admins 🙂 alors pour stackoverflow c'est hors sujet.
-print0
et--files0-from=-
et de les remplacer par un appel àxargs
, par exemplefind . | xargs du
.find <some_directories> <filters> -exec du -ch "{}" + | tail -1 | cut -f 1
Ce code ajoute tous les octets à partir de l'fidèle ls pour tous les fichiers (il exclut tous les répertoires... apparemment, ils sont 8 ko par dossier/répertoire)
Remarque: Exécuter en tant que root. Résultat, en mégaoctets.
ls -l | tr -s ' ' | cut -d ' ' -f <field number>
est quelque chose que j'utilise beaucoup.Le 5e champ est la taille. Mettre cette commande dans une boucle for et ajouter la taille d'un accumulateur et vous obtiendrez la taille totale de tous les fichiers dans un répertoire. Plus facile que l'apprentissage de AWK. En Plus de la substitution de commande, vous pouvez le grep de limiter ce que vous cherchez pour (^- pour les fichiers, et ainsi de suite).