Следующий сценарий создает случайный файл (вокруг 100M) в общей памяти, вычисляет ее контрольную сумму, затем скопируйте его в данное блочное устройство несколько раз так, чтобы целое устройство было заполнено копиями случайных данных при чтении его снова и вычисления его контрольной суммы, чтобы проверить, соответствует ли это действительно исходному.
Это производит вывод как:
We will create a test data file /dev/shm/testsource with size 100000000.
We will fill the device /dev/sdb (of size 16001036288) with this data (in 160 blocks) and then will check if the data is not corrupted.
This will erase all data in /dev/sdb.
Do you want to continue?
1) yes
2) no
#? 1
Creating test source file... (100000000)
Calculating source checksum...
9f4c31858b3bb1122974a5c9d8ec28c6f71b3367
Writing block 0 ...
Checking block 0 ... ok
Writing block 1 ...
Checking block 1 ... ok
Writing block 2 ...
Checking block 2 ... ok
Это требует dd, blockdev, сокращения, sha1sum,/dev/urandom и/dev/shm. Это требует доступа к устройству (обычно корень). Это было протестировано на Linux 2.6.3x. Это медленно. Можно изменить его, чтобы сделать несколько передач или делать все записи затем вся проверка или ожидать когда-то прежде, чем проверить ("исчезнуть" тест).
#!/bin/bash
TARGETDEVICE=$1
TESTFILE="/dev/shm/testsource"
BLOCKSIZE="100000000"
if [ -b "$1" ]; then
TARGETSIZE=$(blockdev --getsize64 $TARGETDEVICE)
if [ "$TARGETSIZE" -gt 0 ] ; then
let "BLOCKS=$TARGETSIZE / $BLOCKSIZE"
if [ "$BLOCKS" -lt 2 ] ; then
BLOCKSIZE=$TARGETSIZE
BLOCKS=1
fi
fi
echo "We will create a test data file $TESTFILE with size $BLOCKSIZE."
echo "We will fill the device $TARGETDEVICE (of size $TARGETSIZE) with this data (in $BLOCKS blocks) and then will check if the data is not corrupted."
echo "This will erase all data in $TARGETDEVICE."
echo "Do you want to continue?"
select choice in yes no ; do
if [ "$choice" == "yes" ] ; then
echo "Creating test source file... ($BLOCKSIZE)"
dd if=/dev/urandom of=$TESTFILE bs=$BLOCKSIZE count=1 status=noxfer 2> /dev/null
echo "Calculating source checksum..."
CHECKSUM=$(sha1sum $TESTFILE | cut -d " " -f 1)
echo $CHECKSUM
for ((y=0 ; y<$BLOCKS ; y++)) ; do
echo "Writing block $y ..."
dd if=$TESTFILE of=$TARGETDEVICE bs=$BLOCKSIZE count=1 seek=$y status=noxfer 2> /dev/null
echo -n "Checking block $y ... "
TESTCHECKSUM=$(dd if=$TARGETDEVICE bs=$BLOCKSIZE count=1 skip=$y status=noxfer 2> /dev/null | sha1sum | cut -d " " -f 1)
if [ "$CHECKSUM" == "$TESTCHECKSUM" ] ; then
echo "ok"
else
echo "MISMATCH"
echo "(found $TESTCHECKSUM)"
fi
done
rm -f $TESTFILE
break
fi
if [ "$choice" == "no" ] ; then
echo
echo "Operation cancelled"
echo
break
fi
done
else
echo
echo "Missing or wrong target device"
echo "Usage: $0 /dev/device"
echo
fi
По-видимому, это использовалось для индексации Справочника Unix в былые дни.
В Ссылках ниже, статья Wikipedia объясняет, что переставленный индекс (также назван KWIC, или "Ключевым словом в контексте") и заканчивается загадочным:
Книги, состоявшие из многих коротких разделов с их собственными описательными заголовками, прежде всего наборы страниц руководства, часто заканчиваемых переставленным индексным разделом, позволяя читателю легко найти раздел любым словом из его заголовка. Эта практика больше не является обычной.
Больше поиска показывает остающиеся статьи в Ссылках, которые объясняют больше о том, как страницы справочника Unix использовали переставленный индекс. Это кажется основным вопросом, с которым они имели дело, то, что страницы справочника не имели никакой непрерывной нумерации.
Из того, что я собираюсь, практика использования переставленного индекса является теперь тайной и устаревшей.
Ссылки
Также известен как конкорданс. И они по-прежнему актуальны и весьма полезны. Хороший пример - быстрое определение библейских стихов, когда вы знаете только несколько слов. Другой пример - индексация всех сонетов Шекспира, чтобы обеспечить аналогичный быстрый поиск по ключевому слову.
Принятый ответ @Joseph R. с историей - это хорошо, но давайте посмотрим, как его можно использовать.
ptx
генерирует индекс переставленных терминов («ptx») из текста.Самый простой для понимания пример:
$ cat input
a
b
c
$ ptx -A -w 25 input
:1: a b c
:2: a b c
:3: a b c
^^^^ ^ ^^^^-words to the input's right
| +-here is the actual input
+-words to the input's left
Внизу справа вы видите разные слова из ввода и окружающие их левый и правый контекст . Первое слово - «а». Он встречается в первой строке, за ним справа следуют «b» и «c». Второе слово - «b», которое встречается во второй строке, где «a» слева и «c» справа. Наконец, «c» встречается в третьей строке, после нее идут «a» и «b».
Используя это, вы можете найти номер строки и окружающие слова для любого слова в тексте. Это очень похоже на grep
, а? Разница в том, что ptx
понимает структуру текста в логических единицах слов и предложений. Это делает контекстный вывод ptx
более актуальным при работе с английским текстом, чем с grep.
Давайте сравним ptx
и grep
, используя первый абзац американского таблоида Джеймса Эллроя :
$ cat text
America was never innocent. We popped our cherry on the boat over and looked back with no regrets. You can’t ascribe our fall from grace to any single event or set of circumstances. You can’t lose what you lacked at conception.
Вот grep
(с соответствие цветов вручную изменено, чтобы быть окруженным //
):
$ grep -ni you text
1:America was never innocent. We popped our cherry on the boat over and looked back with no regrets. /You/ can’t ascribe our fall from grace to any single event or set of circumstances. /You/ can’t lose what /you/ lacked at conception.
Вот ptx
:
$ ptx -Afo <(echo you) text
text:1: /back with no regrets. You can’t ascribe our fall/
text:1: /or set of circumstances. You can’t lose what you/
text:1: /. You can’t lose what you lacked at conception.
Потому что grep
ориентирован на линию, а этот абзац - всего одна строка, вывод grep
не такой краткий и полезный, как вывод из ptx
.