ipy_fsops.py
179 lines
| 4.5 KiB
| text/x-python
|
PythonLexer
vivainio
|
r851 | """ File system operations | ||
Contains: Simple variants of normal unix shell commands (icp, imv, irm, | ||||
imkdir, igrep). | ||||
Some "otherwise handy" utils ('collect' for gathering files to | ||||
~/_ipython/collect, 'inote' for collecting single note lines to | ||||
~/_ipython/note.txt) | ||||
Mostly of use for bare windows installations where cygwin/equivalent is not | ||||
installed and you would otherwise need to deal with dos versions of the | ||||
commands (that e.g. don't understand / as path separator). These can | ||||
do some useful tricks on their own, though (like use 'mglob' patterns). | ||||
Not to be confused with ipipe commands (ils etc.) that also start with i. | ||||
""" | ||||
import IPython.ipapi | ||||
ip = IPython.ipapi.get() | ||||
import shutil,os,shlex | ||||
from IPython.external import mglob | ||||
vivainio
|
r860 | |||
from IPython.ipapi import UsageError | ||||
vivainio
|
r851 | |||
def parse_args(args): | ||||
""" Given arg string 'CMD files... target', return ([files], target) """ | ||||
tup = args.split(None, 1) | ||||
if len(tup) == 1: | ||||
vivainio
|
r860 | raise UsageError("Expected arguments for " + tup[0]) | ||
vivainio
|
r851 | |||
tup2 = shlex.split(tup[1]) | ||||
flist, trg = mglob.expand(tup2[0:-1]), tup2[-1] | ||||
if not flist: | ||||
vivainio
|
r860 | raise UsageError("No files found:" + str(tup2[0:-1])) | ||
vivainio
|
r851 | return flist, trg | ||
def icp(ip,arg): | ||||
""" icp files... targetdir | ||||
Copy all files to target, creating dirs for target if necessary | ||||
icp srcdir dstdir | ||||
Copy srcdir to distdir | ||||
""" | ||||
import distutils.dir_util | ||||
fs, targetdir = parse_args(arg) | ||||
vivainio
|
r860 | if not os.path.isdir(targetdir) and len(fs) > 1: | ||
vivainio
|
r851 | distutils.dir_util.mkpath(targetdir,verbose =1) | ||
for f in fs: | ||||
vivainio
|
r860 | if os.path.isdir(f): | ||
shutil.copytree(f, targetdir) | ||||
else: | ||||
shutil.copy2(f,targetdir) | ||||
vivainio
|
r851 | return fs | ||
ip.defalias("icp",icp) | ||||
def imv(ip,arg): | ||||
""" imv src tgt | ||||
Move source to target. | ||||
""" | ||||
fs, target = parse_args(arg) | ||||
if len(fs) > 1: | ||||
assert os.path.isdir(target) | ||||
for f in fs: | ||||
shutil.move(f, target) | ||||
return fs | ||||
ip.defalias("imv",imv) | ||||
def irm(ip,arg): | ||||
""" irm path[s]... | ||||
Remove file[s] or dir[s] path. Dirs are deleted recursively. | ||||
""" | ||||
vivainio
|
r860 | try: | ||
paths = mglob.expand(arg.split(None,1)[1]) | ||||
except IndexError: | ||||
raise UsageError("%irm paths...") | ||||
vivainio
|
r851 | import distutils.dir_util | ||
for p in paths: | ||||
print "rm",p | ||||
if os.path.isdir(p): | ||||
distutils.dir_util.remove_tree(p, verbose = 1) | ||||
else: | ||||
os.remove(p) | ||||
ip.defalias("irm",irm) | ||||
def imkdir(ip,arg): | ||||
""" imkdir path | ||||
Creates dir path, and all dirs on the road | ||||
""" | ||||
import distutils.dir_util | ||||
targetdir = arg.split(None,1)[1] | ||||
distutils.dir_util.mkpath(targetdir,verbose =1) | ||||
ip.defalias("imkdir",imkdir) | ||||
def igrep(ip,arg): | ||||
""" igrep PAT files... | ||||
Very dumb file scan, case-insensitive. | ||||
e.g. | ||||
igrep "test this" rec:*.py | ||||
""" | ||||
elems = shlex.split(arg) | ||||
dummy, pat, fs = elems[0], elems[1], mglob.expand(elems[2:]) | ||||
res = [] | ||||
for f in fs: | ||||
found = False | ||||
for l in open(f): | ||||
if pat.lower() in l.lower(): | ||||
if not found: | ||||
print "[[",f,"]]" | ||||
found = True | ||||
res.append(f) | ||||
print l.rstrip() | ||||
return res | ||||
ip.defalias("igrep",igrep) | ||||
def collect(ip,arg): | ||||
""" collect foo/a.txt rec:bar=*.py | ||||
Copies foo/a.txt to ~/_ipython/collect/foo/a.txt and *.py from bar, | ||||
likewise | ||||
Without args, try to open ~/_ipython/collect dir (in win32 at least). | ||||
""" | ||||
from path import path | ||||
basedir = path(ip.options.ipythondir + '/collect') | ||||
try: | ||||
fs = mglob.expand(arg.split(None,1)[1]) | ||||
except IndexError: | ||||
os.startfile(basedir) | ||||
return | ||||
for f in fs: | ||||
f = path(f) | ||||
trg = basedir / f.splitdrive()[1].lstrip('/\\') | ||||
if f.isdir(): | ||||
print "mkdir",trg | ||||
trg.makedirs() | ||||
continue | ||||
dname = trg.dirname() | ||||
if not dname.isdir(): | ||||
dname.makedirs() | ||||
print f,"=>",trg | ||||
shutil.copy2(f,trg) | ||||
ip.defalias("collect",collect) | ||||
def inote(ip,arg): | ||||
""" inote Hello world | ||||
Adds timestamp and Hello world to ~/_ipython/notes.txt | ||||
Without args, opens notes.txt for editing. | ||||
""" | ||||
import time | ||||
fname = ip.options.ipythondir + '/notes.txt' | ||||
try: | ||||
entry = " === " + time.asctime() + ': ===\n' + arg.split(None,1)[1] + '\n' | ||||
f= open(fname, 'a').write(entry) | ||||
except IndexError: | ||||
ip.IP.hooks.editor(fname) | ||||
ip.defalias("inote",inote) | ||||