Изменения

Перейти к: навигация, поиск

~s - скрипты-утилиты

3210 байтов добавлено, 22:21, 7 декабря 2013
м
[{{SVN|vitalif/trunk/scripts/cpshift.c|co}} cpshift.c]
== [{{SVN|vitalif/trunk/scripts/cpshift.c|co}} cpshift.c] ==
Простая C-программка для копирования кусков файлов. Возможно, велосипедНечто типа dd, но с первого взгляда я такой стандартной unix-тулы не нашёл. Естьудобнее, конечнопотому что* Не требует задавать смещения, ddкратные размеру буфера => простая задача «вытащить X байт из файла, но он работает начиная с Y» выполняется в ПИЦОТ раз медленнеебыстрее, потому что приходится говорить используется большой буфер, а не dd bs=1 .* Поддерживает обратный порядок копирования => позволяет корректно перемещать данные внутри одного файла (чтение и запись по 1 байтунапример, разделы на диске!)ВПЕРЁД. Если имя входного файла равно имени выходного, то сама выбирает нужный порядок — вперёд или назад — по разнице смещений.
Компилировать Короче, может быть, оно и использовать велосипед, но с первого взгляда я такой стандартной unix-тулы не нашёл, а dd, простите, дебилен. Компилировать тривиально:
gcc -o cpshift cpshift.c
./cpshift --skip SKIP_BYTES --size SIZE_BYTES infile outfile
Использовать тоже просто, вот только опций поприбавилось :)  ./cpshift [OPTIONS] infile [outfile] * Копирует кусок файла 'infile' в 'outfile'.* 'infile' может быть равен 'outfile', тогда данные перемещаются в одном файле.* Никогда не обрезает длину выходного файла.* Если 'outfile' не задан или равен '-', то данные копируются на STDOUT. 'infile' также может быть '-', в этом случае данные копируются из STDIN. Однако, эти потоки всё равно должны поддерживать позиционирование, что cpshift с ними работал.* Все численные параметры могут быть десятичными (например, 256), шестнадцатеричными (0x1AB) или восьмеричными (0127). Опции:* --skip SKIP_BYTES — смещение от начала входного файла, в байтах.* --size SIZE_BYTES — максимальный размер копируемой областив байтах. Оба могут быть как десятичными* --skip-output SKIP_IN_OUTPUT — смещение в выходном файле в байтах.* --buffer BUFFER_SIZE — размер буфера (сколько байт копировать за раз). По умолчанию 1 Мб (0x100000 байт).* --reverse — задаёт обратный порядок копирования. В принципе, опция нужна редко, так и восьмеричными (как если начинается с 0входной файл равен выходному, то нужный порядок выбирается на основе смещений автоматически. === English help ===    ./cpshift [OPTIONS] infile [outfile] * Copies part of 'infile' to 'outfile'.* Never truncates the output file.* 'infile' can be equal to 'outfile', then data is moved within one file.* All numeric parameters may be decimal (256), и шестнадцатеричными hexadecimal (если начинается с 0x0x1AB) or octal (0127).* '-' can be specified as 'infile' (means STDIN) or 'outfile' (means STDOUT). Note that it must be anyway seekable for cpshift to work with it. Options:* --skip SKIP_BYTES — skip to this position inside the input file.* --size SIZE_BYTES — copy at most this count of bytes.* --skip-output SKIP_IN_OUTPUT — skip to this position inside the output file.* --buffer BUFFER_SIZE — copy this count of bytes at once (default 1 MB = 0x100000 bytes).* --reverse — use reverse copying order. In most cases you don’t need to set this manually because when you’re moving data within one file, the correct copying order is selected automatically based on offsets (reverse order is used when moving data forward, forward order is used when moving data backward).
== convert-filenames ==

Навигация