Как узнать, сколько битов у файла в одной команде?


9

Я знаю, что могу использовать, ls -latчтобы узнать, сколько байтов имеет файл, а затем умножить на 8, чтобы узнать, сколько битов. Но возможно ли это только в одной командной строке?


5
Я так не думаю. Я также не вижу практического использования такой функции ^^
Мартин фон Виттих

1
@MartinvonWittich - скорость интернета часто указывается в « битах в секунду» ...
Уилф

4
@wilf: минус издержки протокола.
Игнасио Васкес-Абрамс

В моем случае я использую этот тест костюма: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html, а параметр - это количество бит, которые я хочу проанализировать.
Фелипе

Ответы:


15

С GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc

9
За исключением того, что это не нужно bc- awkможет сделать математику сам:du -b FILE | awk '{print $1 * 8}
aragaer

Смотрите также wc -c < FILEдля переносимого эквивалента (для нерегулярных файлов, это имеет побочный эффект чтения их)
Стефан Шазелас

5

Решение shell + GNU coreutils:

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

-c%sОпция statвозвращает только размер файла в байтах, исключая любую необходимость в дополнительной обработке текста. Этот синтаксис поддерживается GNU coreutils и поэтому должен работать в большинстве дистрибутивов Linux.

В качестве исключения в Linux, если вы запускаете zsh с необязательным модулем zsh / stat, нужно указать путь для получения GNU coreutils:

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

@StephaneChazelas Спасибо за информацию. Ответ обновлен.
John1024

Кажется, хорошее объяснение, спасибо. Однако в моем тесте эта команда вернула мне: title: 7: выражение "плохая математика": ожидаемый операнд в `% s '] 2; echo 4096000 ---- ответ 4096000, но каковы другие ошибки?
Фелипе

@FelipeMicaroniLalli Я не могу воспроизвести эту ошибку, и я не вижу никаких обстоятельств, которые бы (а) давали это сообщение об ошибке, и в то же время (б) давали правильный числовой ответ. Любопытно.
John1024

3

С GNU find(предшествует GNU statдесятилетиями):

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

Относительно переносимо:

ls -ld -- "$file" | awk '{print $5*8;exit}'

3

Это возможно в одной строке, потому что вы можете поместить несколько команд в одну строку, например, связанных трубами или подстановками команд:

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

(Спасибо @frostschutz за обновление).


Работал как шарм для меня. Mp tmp stat random-file-3 | sed -n 's / Size: ([0-9] *). * / \ 1 * 8 / p' | до н.э. 4096000
Фелипе

Не будет работать в неанглийских локалях или в системах, отличных от GNU, или для файла, называемого, ZSize: 5например,
Стефан Шазелас,

1
Как насчет stat -c %s FILEпечати размера, а не sed?
frostschutz

2

Отдельный файл:

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

Mutiple файлы:

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

Этот также работает для одного файла. Это не полностью пуленепробиваемый, хотя, см. Комментарий Стефана .

Это стандартные команды POSIX.


Отлично. Потрясающие. Mp tmp wc -c random-file-1 random-file-2 random-file-3 | awk '{$ 1 * = 8; print $ 0} '32832 случайных файлов-1 ➜ 49152 случайных файлов-2 ➜ 4096000 случайных файлов-3 77 4177984 всего
Фелипе

1
Обратите внимание, что это имеет побочные эффекты, если файлы не являются обычными файлами. Второй будет отображать a    bфайл как a b(последовательности пробелов, преобразованные в один пробел, удаленные пробелы удалены).
Стефан Шазелас

@StephaneChazelas с каким нестандартным файлом вы пробовали, пожалуйста?
Тотор

Любой тип (fifos, розетки, двери, устройства, каталоги ...). У вас также будут проблемы с именами файлов, содержащими символы новой строки. Вы можете добавитьNR == 1
Стефан Шазелас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.