Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- """
- Implementation of Linux 'cp' command
- with r and f modes.
- """
- __author__ = 'Irshad Ahmad Bhat'
- __email__ = 'bhatirshad127@gmail.com'
- import os
- import sys
- import stat
- def copyfile(file_path, targer_dir):
- os.chdir(file_path[:file_path.rindex('/')])
- file_name = file_path[file_path.rindex('/')+1:]
- if not os.access(file_name, os.R_OK):
- if sys.argv[1] !='-f':
- print "permission denied"
- sys.exit()
- else:
- acc_mode = os.stat(file_name)
- os.chmod(file_name, acc_mode.st_mode | stat.S_IREAD)
- file_pointer = open(file_name, 'rb')
- temp_file = file_pointer.read()
- file_pointer.close()
- os.chdir(target_dir)
- file_pointer =open(file_name, 'wb')
- file_pointer.write(temp_file)
- file_pointer.close()
- print "Done..."
- def recursive_copy(source_dir, target_dir):
- if not (os.access(source_dir, os.X_OK) and os.access(source_dir, os.R_OK)):
- if 'f' not in sys.argv[1]:
- print "permission denied"
- sys.exit()
- else:
- acc_mode = os.stat(source_dir)
- os.chmod(source_dir, acc_mode.st_mode | stat.S_IXUSR)
- os.chmod(source_dir, acc_mode.st_mode | stat.S_IREAD)
- os.chdir(target_dir)
- os.makedirs(source_dir[source_dir.rindex('/')+1:])
- target_dir2 = target_dir +'/'+ source_dir[source_dir.rindex('/')+1:]
- wlk = os.walk(source_dir)
- root, dirnames, filenames = next(wlk)
- for new_file in filenames:
- os.chdir(source_dir)
- if not os.access(new_file, os.R_OK):
- if 'f' not in sys.argv[1]:
- print "permission denied"
- sys.exit()
- else:
- acc_mode = os.stat(new_file)
- os.chmod(new_file, acc_mode.st_mode | stat.S_IREAD)
- file_pointer = open(root+'/'+new_file, 'rb')
- temp_file = file_pointer.read()
- file_pointer.close()
- os.chdir(target_dir2)
- file_pointer =open(new_file, 'wb')
- file_pointer.write(temp_file)
- file_pointer.close()
- for new_dir in dirnames:
- recursive_copy(root+'/'+new_dir,target_dir2)
- if __name__ == "__main__":
- if len(sys.argv)==4 and os.path.isdir(sys.argv[2]):
- if not (sys.argv[1] == '-r' or sys.argv[1] == '-rf' or sys.argv[1] == '-fr'):
- inv = list(set(sys.argv[1]) - set('-rf'))
- if inv: print "invalid option -- '{}'".format(inv[0])
- else: print "omitting directory '{}'".format(sys.argv[2])
- sys.exit()
- else:
- if not (os.path.isdir(sys.argv[3])):
- print "'{}': No such file or directory".format(sys.argv[3])
- sys.exit()
- source_dir = os.path.abspath(sys.argv[2])
- target_dir = os.path.abspath(sys.argv[3])
- top = target_dir +'/'+ source_dir[source_dir.rindex('/')+1:]
- if source_dir == top:
- print "'{}' and '{}' are the same file".format(sys.argv[2],top)
- sys.exit()
- if os.path.exists(top):
- for root, dirs, files in os.walk(top, topdown=False):
- for name in files:
- os.remove(os.path.join(root, name))
- for name in dirs:
- os.rmdir(os.path.join(root, name))
- os.rmdir(top)
- recursive_copy(source_dir,target_dir)
- print "Done..."
- elif len(sys.argv) == 3 or (len(sys.argv) == 4 and os.path.isfile(sys.argv[2])):
- if len(sys.argv) == 4:
- file_path = sys.argv[2]
- target_dir = sys.argv[3]
- else:
- file_path = sys.argv[1]
- target_dir = sys.argv[2]
- if not (os.path.exists(file_path) and os.path.exists(target_dir)):
- print "'{}': No such file or directory".format(file_path)
- if os.path.isdir(file_path):
- print "omitting directory '{}'".format(file_path)
- sys.exit()
- copyfile(os.path.abspath(file_path),os.path.abspath(target_dir))
- else:
- if len(sys.argv) != 4:
- print "Enter valid arguments"
- sys.exit()
- print "'{}': No such file or directory".format(sys.argv[2]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement