From 3514265e115ea5b3bee143c614c46492842af4f2 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Thu, 23 Apr 2009 09:36:58 +0300 Subject: Wrote utility to create empty files. --- create-file | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 create-file diff --git a/create-file b/create-file new file mode 100755 index 0000000..dd41073 --- /dev/null +++ b/create-file @@ -0,0 +1,89 @@ +#!/usr/bin/python +# +# create-file -- create a file full of zeroes +# Copyright (C) 2009 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +import optparse +import os + + +def parse_size(size): + sizes = ( + ("k", 1000), + ("m", 1000**2), + ("g", 1000**3), + + ("kb", 1000), + ("mb", 1000**2), + ("gb", 1000**3), + + ("kib", 1024), + ("mib", 1024**2), + ("gib", 1024**3), + ) + size = size.lower() + for suffix, x in sizes: + if size.endswith(suffix): + amount = int(size[:-len(suffix)].strip()) + return amount * x + return int(size.strip()) + + +def parse_args(): + parser = optparse.OptionParser() + + parser.epilog = ("SIZE is a size. Default is in bytes, use suffixes " + "kB/MB/GB for multiples of 1000, KiB/MiB/GiB for " + "multiples of 1024. Only integers supported.") + + parser.add_option("--sparse", action="store_true", + help="create a sparse file") + + parser.add_option("--size", metavar="SIZE", default="0", + help="create a file of size SIZE") + + options, filenames = parser.parse_args() + options.size = parse_size(options.size) + + return options, filenames + + +def create_file(filename, options): + fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0666) + if options.sparse: + if options.size > 0: + os.lseek(fd, options.size - 1, os.SEEK_SET) + os.write(fd, "\0") + else: + bytes = options.size + data = "\0" * 1024**2 + while bytes >= len(data): + os.write(fd, data) + bytes -= len(data) + if bytes > 0: + os.write(fd, data[:bytes]) + os.close(fd) + + +def main(): + options, filenames = parse_args() + for filename in filenames: + create_file(filename, options) + + +if __name__ == "__main__": + main() -- cgit v1.2.1 From 2811012b43d1d045358992add5af3b5c1b524e65 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Wed, 29 Apr 2009 18:13:01 +0300 Subject: Wrote manual page. --- create-file.1 | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 create-file.1 diff --git a/create-file.1 b/create-file.1 new file mode 100644 index 0000000..4bdfea7 --- /dev/null +++ b/create-file.1 @@ -0,0 +1,45 @@ +.\" create-file.1 - manual page for the create-file command +.\" Copyright (C) 2009 Lars Wirzenius +.\" +.\" This program is free software: you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation, either version 3 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program. If not, see . +.\" +.TH CREATE-FILE 1 +.SH NAME +create-file \- create a file full of zero bytes +.SH SYNOPSIS +.B create-file +.RB [ -h ] +.RB [ --help ] +.RB [ --sparse ] +.RB [ --size =\fISIZE ] +.RI [ filename ]... +.SH DESCRIPTION +.B create-file +creates a file full of zero bytes (0x00, NUL). +.SH OPTIONS +.TP +.BR -h ", " --help +Show a short help message. +.TP +.B --sparse +Create a sparse file, which does not allocate disk blocks. +.TP +.BR --size =\fISIZE +Create a file of +.I SIZE +bytes. +The size may be have a suffix to indicate kilobyte (K, KB), megabyte (M, MB), +or gigabyte (G, GB), or power-of-two multipliers for kibibyte (KiB), +mebibyte (MiB), or gibibyte (GiB). +All suffixes are case-insensitive. -- cgit v1.2.1