diff options
author | Lars Wirzenius <liw@liw.fi> | 2009-04-23 09:36:58 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2009-04-23 09:36:58 +0300 |
commit | 3514265e115ea5b3bee143c614c46492842af4f2 (patch) | |
tree | 3b7d27114611cb1e630dc1fa568763fec246c52d | |
parent | fca0f1229335f599176866f64b03a2df442c773c (diff) | |
download | extrautils-3514265e115ea5b3bee143c614c46492842af4f2.tar.gz |
Wrote utility to create empty files.
-rwxr-xr-x | create-file | 89 |
1 files changed, 89 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. + + +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() |