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

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
cybermage14
источник
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) ))
John1024
источник
@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 за обновление).

choroba
источник
Работал как шарм для меня. 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.

Totor
источник
Отлично. Потрясающие. 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
Стефан Шазелас