В 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
). Но доступ к одному файлу в таком пакете возвращает вывод пакета _доступа к настоящему.
Вы можете сделать это, используя cmp
, по сравнению с/dev/zero
:
cmp /path/to/block-device /dev/zero
cmp
даст вам смещение первого не -нулевого байта.
Если вы хотите пропустить байты, вы можете использовать опцию -i
GNU 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
Это будет работать с любым файлом, а не только с блочными устройствами.
Ответ Стивена Китта делает это немного бессмысленным (он более краток и более чем на один порядок быстрее ), но у вас есть альтернатива (шестнадцатеричный )дамп содержимого вашего устройства, один байт на строку,и передать его программе, которая печатает адрес первого байта, представление которого не равно 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
выводить данные в предпочтительном формате, необходимо вычислить смещение первого не-нулевого байта, добавив его позицию в строке, в которой он появляется, к адресу строки.