#!/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()