66 lines
1.3 KiB
Python
Executable File
66 lines
1.3 KiB
Python
Executable File
#! /usr/local/python
|
|
|
|
# mkreal
|
|
#
|
|
# turn a symlink to a directory into a real directory
|
|
|
|
import sys
|
|
import posix
|
|
import path
|
|
from stat import *
|
|
|
|
cat = path.cat
|
|
|
|
error = 'mkreal error'
|
|
|
|
BUFSIZE = 32*1024
|
|
|
|
def mkrealfile(name):
|
|
st = posix.stat(name) # Get the mode
|
|
mode = S_IMODE(st[ST_MODE])
|
|
linkto = posix.readlink(name) # Make sure again it's a symlink
|
|
f_in = open(name, 'r') # This ensures it's a file
|
|
posix.unlink(name)
|
|
f_out = open(name, 'w')
|
|
while 1:
|
|
buf = f_in.read(BUFSIZE)
|
|
if not buf: break
|
|
f_out.write(buf)
|
|
del f_out # Flush data to disk before changing mode
|
|
posix.chmod(name, mode)
|
|
|
|
def mkrealdir(name):
|
|
st = posix.stat(name) # Get the mode
|
|
mode = S_IMODE(st[ST_MODE])
|
|
linkto = posix.readlink(name)
|
|
files = posix.listdir(name)
|
|
posix.unlink(name)
|
|
posix.mkdir(name, mode)
|
|
posix.chmod(name, mode)
|
|
linkto = cat('..', linkto)
|
|
#
|
|
for file in files:
|
|
if file not in ('.', '..'):
|
|
posix.symlink(cat(linkto, file), cat(name, file))
|
|
|
|
def main():
|
|
sys.stdout = sys.stderr
|
|
progname = path.basename(sys.argv[0])
|
|
args = sys.argv[1:]
|
|
if not args:
|
|
print 'usage:', progname, 'path ...'
|
|
sys.exit(2)
|
|
status = 0
|
|
for name in args:
|
|
if not path.islink(name):
|
|
print progname+':', name+':', 'not a symlink'
|
|
status = 1
|
|
else:
|
|
if path.isdir(name):
|
|
mkrealdir(name)
|
|
else:
|
|
mkrealfile(name)
|
|
sys.exit(status)
|
|
|
|
main()
|