Je veux exécuter une commande find
qui va trouver une certaine liste de fichiers, puis parcourir cette liste de fichiers pour exécuter certaines opérations. Je souhaite également connaître la taille totale de tous les fichiers de cette liste.
Je voudrais faire la liste des fichiers en premier, puis faire les autres opérations. Existe-t-il un moyen simple de signaler uniquement la taille totale de tous les fichiers de la liste?
En substance, j'essaie de trouver une ligne pour la variable 'total_size' 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 devriez simplement pouvoir passer de $file_list
à du
:
du -ch $file_list | tail -1 | cut -f 1
du
options:
-c
afficher un total-h
lisible par l'homme (c'est-à-dire 17M)du
imprimera une entrée pour chaque fichier, suivie du total (avec -c
), nous utilisons donc tail -1
pour ajuster à la dernière ligne et cut -f 1
pour ajuster cette ligne à la première colonne.
Les méthodes expliquées ici ont un bogue caché. Lorsque la liste de fichiers est longue, elle dépasse la taille limite de la commande Shell. Mieux vaut utiliser celui-ci en utilisant du:
find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1
find produit une liste de fichiers terminée par un null, du prend de stdin et compte . ceci est indépendant de la taille limite des commandes Shell . vous a dit combien d’espace physique les fichiers vont occuper.
Mais je pense que ce n'est pas une question pour les programmeurs, mais pour les administrateurs Unix :), alors pour stackoverflow c'est hors sujet.
Ce code additionne tous les octets de la confiance ls pour tous les fichiers (il exclut tous les répertoires ... apparemment, ils sont 8 Ko par dossier/répertoire)
cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}'
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 5ème champ est la taille. Placez cette commande dans une boucle for et ajoutez la taille à un accumulateur pour obtenir la taille totale de tous les fichiers d'un répertoire. Plus facile que d'apprendre AWK. De plus, dans la partie substitution de commande, vous pouvez grep pour limiter ce que vous recherchez (^ - pour les fichiers, etc.).
total=0
for size in $(ls -l | tr -s ' ' | cut -d ' ' -f 5) ; do
total=$(( ${total} + ${size} ))
done
echo ${total}