Comment savoir combien de bits un fichier contient dans une commande?

9

Je sais que je peux utiliser ls -latpour savoir combien d'octets ont un fichier, puis multiplier par 8 pour savoir combien de bits. Mais est-ce possible dans une seule ligne de commande?

Felipe
la source
5
Je ne pense pas. Je ne vois pas non plus d'utilisation pratique d'une fonctionnalité comme celle-là ^^
Martin von Wittich
1
@MartinvonWittich - Les vitesses Internet se font souvent en « bits par seconde» ...
Wilf
4
@wilf: surcharge du protocole Minus.
Ignacio Vazquez-Abrams le
Dans mon cas, j'utilise ce test de costume: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html et le paramètre est le nombre de bits que je veux analyser.
Felipe

Réponses:

15

Avec GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc
cybermage14
la source
9
Sauf qu'il n'a pas besoin bc- awkpeut faire des maths lui-même:du -b FILE | awk '{print $1 * 8}
aragaer
Voir aussi wc -c < FILEpour un équivalent portable (pour les fichiers non réguliers, cela a cependant pour effet secondaire de les lire)
Stéphane Chazelas
5

Une solution shell + GNU coreutils:

echo $(( 8 * $(stat -c%s FILE) ))

L' -c%soption de statretourne uniquement la taille du fichier en octets, éliminant ainsi tout besoin de traitement de texte supplémentaire. Cette syntaxe est prise en charge par GNU coreutils et devrait donc fonctionner sous la plupart des distributions Linux.

Par exception sur linux, si l'on exécute zsh avec le module zsh / stat optionnel, alors il faut spécifier un chemin pour obtenir les coreutils GNU:

echo $(( 8 * $(command stat -c%s FILE) ))
John1024
la source
@StephaneChazelas Merci pour l'info. Réponse mise à jour.
John1024
Cela semble une bonne explication, merci. Cependant dans mon test, cette commande m'a été renvoyée: title: 7: mauvaise expression mathématique: opérande attendu à `% s '] 2; echo 4096000 ---- la réponse est 4096000, mais quelles sont les autres erreurs?
Felipe
@FelipeMicaroniLalli Je ne peux pas reproduire cette erreur et je ne vois aucune circonstance qui à la fois (a) donnerait ce message d'erreur et, en même temps, (b) donnerait la bonne réponse numérique. Curieuse.
John1024
3

Avec GNU find(antérieur à GNU statde plusieurs décennies):

find file -prune -printf '%s*8\n' | bc

Relativement portable:

ls -ld -- "$file" | awk '{print $5*8;exit}'
Stéphane Chazelas
la source
3

C'est possible sur une seule ligne, car vous pouvez mettre plusieurs commandes sur une même ligne, par exemple connectées par des tuyaux ou des substitutions de commande:

echo $(stat -c %s FILE) '* 8' | bc

(Merci @frostschutz pour la mise à jour).

choroba
la source
A fonctionné comme un charme pour moi. ➜ tmp stat fichier-aléatoire-3 | sed -n 's / Taille: ([0-9] *). * / \ 1 * 8 / p' | bc ➜ 4096000
Felipe
Ne fonctionnera pas dans des environnements locaux non anglais ou sur des systèmes non GNU ou pour un fichier appelé ZSize: 5par exemple
Stéphane Chazelas
1
que diriez-vous stat -c %s FILEd'imprimer la taille directement, au lieu de la sed?
frostschutz
2

Un seul fichier:

wc -c yourfile | awk '{print $1*8}'

Fichiers multiples:

wc -c yourfile1 yourfile2 | awk '{$1*=8; print $0}'

Celui-ci fonctionne également pour un seul fichier. Il n'est cependant pas complètement à l'épreuve des balles, voir le commentaire de Stéphane .

Ce sont des commandes conformes à la norme POSIX.

Totor
la source
Génial. Impressionnant. ➜ tmp wc -c fichier-aléatoire-1 fichier-aléatoire-2 fichier-aléatoire-3 | awk '{$ 1 * = 8; imprimer $ 0} '➜ 32832 fichier-aléatoire-1 ➜ 49152 fichier-aléatoire-2 ➜ 4096000 fichier-aléatoire-3 ➜ 4177984 au total
Felipe
1
Notez qu'il a des effets secondaires si les fichiers ne sont pas des fichiers normaux. Le second afficherait un a    bfichier sous la forme a b(séquences de blancs convertis en un seul espace, blancs de fin supprimés).
Stéphane Chazelas
@StephaneChazelas avec quel type de fichier non régulier avez-vous essayé s'il vous plaît?
Totor
Tout type (fifos, prises, portes, appareils, répertoires ...). Vous aurez également des problèmes avec les noms de fichiers contenant des caractères de nouvelle ligne. Vous pouvez ajouter unNR == 1
Stéphane Chazelas