70 lines
1.8 KiB
Python
Executable File
70 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import time
|
|
from argparse import ArgumentParser
|
|
|
|
|
|
class Verbose:
|
|
def __init__(self):
|
|
self.progress_chars = " ▏▎▍▌▋▊▉█"
|
|
self.progress_n = 0
|
|
self.ts = 0
|
|
self.loops = 0
|
|
|
|
def next(self):
|
|
if time.time() > self.ts + 0.1:
|
|
s = (
|
|
" "
|
|
+ self.loops * self.progress_chars[-1]
|
|
+ self.progress_chars[self.progress_n]
|
|
+ "\r"
|
|
)
|
|
print(s, file=sys.stderr, end="")
|
|
self.progress_n = (1 + self.progress_n) % len(self.progress_chars)
|
|
if self.progress_n == 0:
|
|
self.loops += 1
|
|
if self.loops >= 10:
|
|
print(" " * 11 + "\r", file=sys.stderr, end="")
|
|
self.loops = 0
|
|
sys.stderr.flush()
|
|
self.ts = time.time()
|
|
|
|
|
|
# Set up options
|
|
parser = ArgumentParser(
|
|
description="Sponge file before writing output: grep foo file.txt | sponge file.txt",
|
|
epilog="This tool is a modification from http://joeyh.name/code/moreutils/ with the same name.",
|
|
)
|
|
parser.add_argument(
|
|
"-a",
|
|
action="store_true",
|
|
dest="append",
|
|
default=False,
|
|
help="Append to file instead of overwriting",
|
|
)
|
|
parser.add_argument(
|
|
"-v", action="store_true", dest="verbose", default=False, help="Progress to stderr"
|
|
)
|
|
parser.add_argument(type=str, dest="file", help="File to write to")
|
|
options = parser.parse_args()
|
|
|
|
|
|
# choose mode
|
|
mode = "wb"
|
|
if options.append:
|
|
mode = "ab"
|
|
if options.verbose:
|
|
v = Verbose()
|
|
chunk_size = 1024 * 1024 * 1 # Mb
|
|
|
|
# Write the file
|
|
with open(options.file, mode) as writer:
|
|
while True:
|
|
chunk = sys.stdin.buffer.read(chunk_size)
|
|
if not chunk:
|
|
break
|
|
if options.verbose:
|
|
v.next()
|
|
writer.write(chunk)
|