Как найти первый не-нулевой байт на блочном устройстве с необязательным смещением?

В Debian/Ubuntu это дает вам самое последнее время доступа к любому файлу в заданном пакете:

function package_access { dpkg-query -L $1 | xargs stat -c '%F %n' | grep '^regular file ' | sed 's/^regular file //' | xargs stat -c '%x' | sort -r | head -1 ; }

(если в именах нет пробелов/круглых скобок ).

Таким образом, вы можете перечислить свои пакеты с последним временем доступа с помощью:

( for p in $(dpkg-query -f '${Package}\n' --show); do echo "$(package_access "$p") $p" ; done ) | sort -r

(который будет работать какое-то время, а также выводить много дерьма, см. предостережение выше)

Любопытно, что на моей Ubuntu 16.04, установленной в мае 2017 года, он находит пакеты со временем доступа, начиная с 2007 года (tk, поскольку это единственный реальный файл/usr/share/doc/tk/copyright). Но доступ к одному файлу в таком пакете возвращает вывод пакета _доступа к настоящему.

11
01.06.2021, 16:01
2 ответа

Вы можете сделать это, используя cmp, по сравнению с/dev/zero:

cmp /path/to/block-device /dev/zero

cmpдаст вам смещение первого не -нулевого байта.

Если вы хотите пропустить байты, вы можете использовать опцию -iGNU cmpили, если вы не используете GNU cmp, передать соответствующие данные, используяdd:

cmp -i 100 /path/to/block-device /dev/zero
dd if=/path/to/block-device bs=1 skip=100 | cmp - /dev/zero

Это будет работать с любым файлом, а не только с блочными устройствами.

30
28.07.2021, 11:27

Ответ Стивена Китта делает это немного бессмысленным (он более краток и более чем на один порядок быстрее ), но у вас есть альтернатива (шестнадцатеричный )дамп содержимого вашего устройства, один байт на строку,и передать его программе, которая печатает адрес первого байта, представление которого не равно 00, и завершает работу, как только находит его:

od -Ad -w1 -tx1 /dev/device | awk '$2 && $2 != "00" { print $1 + 1; exit }'
Параметр

odдля -jпозволяет дополнительно выбрать число байтов для пропуска (в начале ввода ).

Гораздо более быстрый вариант (благодаря Питеру Кордесу ' комментарии )требуют немного большего набора текста:

od -Ad -tx1 | awk '
  {
    for (i=2; i<=NF; i++)
      if ($i != "00") {
        print ($1 + i -1)
        exit
      }
  }'

Чтобы разрешить odвыводить данные в предпочтительном формате, необходимо вычислить смещение первого не-нулевого байта, добавив его позицию в строке, в которой он появляется, к адресу строки.

8
28.07.2021, 11:27

Теги

Похожие вопросы