Welcome, guest | Sign In | My Account | Store | Cart
#!/usr/bin/env python

################################################################################
#                                                                              #
# Copyright (c) 2013, Mike 'Fuzzy' Partin <fuzzy@fu-manchu.org>                #
# All rights reserved.                                                         #
#                                                                              #
# Redistribution and use in source and binary forms, with or without           #
# modification, are permitted provided that the following conditions are met:  #
#                                                                              #
# 1. Redistributions of source code must retain the above copyright notice,    #
#    this list of conditions and the following disclaimer.                     #
# 2. Redistributions in binary form must reproduce the above copyright notice, #
#    this list of conditions and the following disclaimer in the documentation #
#    and/or other materials provided with the distribution.                    #
#                                                                              #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  #
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE    #
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   #
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE     #
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR          #
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF         #
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS     #
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN      #
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)      #
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE   #
# POSSIBILITY OF SUCH DAMAGE.                                                  #
#                                                                              #
# The views and conclusions contained in the software and documentation are    #
# those of the authors and should not be interpreted as representing official  #
# policies, either expressed or implied, of the FreeBSD Project.               #
#                                                                              #
################################################################################

################################################################################
### Module imports                                                           ###
################################################################################

# Stdlib
import os
import re
import sys
import types

################################################################################
### Main logic and argument handling                                         ###
################################################################################

try:
 
if __name__ == '__main__':

   
### check to see that all args are present on the command line            
   
##############################################################
   
if len(sys.argv) < 3:
     
print("Usage: %s <src>/ <dst>/" % sys.argv[0])
      sys
.exit(1)
   
else:

     
### check to see that source and destination targets exist
     
##########################################################
     
for i in [str(sys.argv[1]), str(sys.argv[2])]:
       
if not os.path.isdir(i):
         
raise OSError("ERROR: %s is not a valid directory." % i)

     
### Setup some convenience
      src    
= str(sys.argv[1])
      dst    
= str(sys.argv[2])
      src_b  
= None

     
if len(sys.argv) == 4:
        src_b
= sys.argv[3]

     
if src_b == None:
       
if src[-1:] == '/':
          src_b
= os.path.basename(src[:-1])
       
else:
          src_b
= os.path.basename(src)

     
### start walking the source target
     
###################################
      dirs_c
= 0 # counter for dires
      file_c
= 0 # counter for files
     
for root, dirs, files in os.walk(src):
       
for i in files:
          os
.symlink('%s/%s'   % (root, i),
                     
'%s%s/%s' % (dst, re.sub(src, '', root), i))
          file_c
+= 1
       
for i in dirs:
         
try:
            os
.mkdir('%s%s/%s' % (dst, re.sub(src, '', root), i))
         
except OSError:
           
pass
          dirs_c
+= 1
        sys
.stdout.write('> %-53s %6d dirs %6d files\r' % (
          src_b
[:52], # basename of src
          dirs_c
,                          # Dir count
          file_c
))                         # File count
        sys
.stdout.flush()

  sys
.stdout.write('> %-53s %6d dirs %6d files\n' % (
    src_b
[:52], # basename of src
    dirs_c
,  # Dir count
    file_c
)) # File count
  sys
.stdout.flush()
except OSError as msg:
 
print(msg)
  sys
.exit(0)

Diff to Previous Revision

--- revision 1 2013-05-28 06:54:37
+++ revision 2 2013-05-28 07:21:28
@@ -46,46 +46,62 @@
 
### Main logic and argument handling                                         ###
 
################################################################################
 
-if __name__ == '__main__':
+try:
+  if __name__ == '__main__':
 
-  ### check to see that all args are present on the command line            
-  ##############################################################
-  if len(sys.argv) != 3:
-    print("Usage: %s <src>/ <dst>/" % sys.argv[0])
-    sys.exit(1)
-  else:
+    ### check to see that all args are present on the command line            
+    ##############################################################
+    if len(sys.argv) < 3:
+      print("Usage: %s <src>/ <dst>/" % sys.argv[0])
+      sys.exit(1)
+    else:
 
-    ### check to see that source and destination targets exist
-    ##########################################################
-    for i in [str(sys.argv[1]), str(sys.argv[2])]:
-      if not os.path.isdir(i):
-        raise OSError("ERROR: %s is not a valid directory." % i)
-    src = str(sys.argv[1])
-    dst = str(sys.argv[2])
+      ### check to see that source and destination targets exist
+      ##########################################################
+      for i in [str(sys.argv[1]), str(sys.argv[2])]:
+        if not os.path.isdir(i):
+          raise OSError("ERROR: %s is not a valid directory." % i)
 
-    ### start walking the source target
-    ###################################
-    dirs_c = 0 # counter for dires
-    file_c = 0 # counter for files
-    for root, dirs, files in os.walk(src):
-      for i in files:
-        #print('ln -s %s/%s %s%s/%s' % (root, i, dst, re.sub(src, '', root), i))
-        os.symlink('%s/%s'   % (root, i),
-                   '%s%s/%s' % (dst, re.sub(src, '', root), i))
-        file_c += 1
-      for i in dirs:
-        #print('mkdir %s%s/%s' % (dst, re.sub(src, '', root), i))
-        os.mkdir('%s%s/%s' % (dst, re.sub(src, '', root), i))
-        dirs_c += 1
-      sys.stdout.write('> %-64s %6dd %6df\r' % (
-        os.path.basename(src), # basename of src
-        dirs_c,  # Dir count
-        file_c)) # File count
-      sys.stdout.flush()
-      #sys.exit(0)
+      ### Setup some convenience
+      src     = str(sys.argv[1])
+      dst     = str(sys.argv[2])
+      src_b   = None
 
-sys.stdout.write('> %-64s %6dd %6df\n' % (
-  os.path.basename(src), # basename of src
-  dirs_c,  # Dir count
-  file_c)) # File count
-sys.stdout.flush()
+      if len(sys.argv) == 4:
+        src_b = sys.argv[3]
+
+      if src_b == None:
+        if src[-1:] == '/':
+          src_b = os.path.basename(src[:-1])
+        else:
+          src_b = os.path.basename(src)
+
+      ### start walking the source target
+      ###################################
+      dirs_c = 0 # counter for dires
+      file_c = 0 # counter for files
+      for root, dirs, files in os.walk(src):
+        for i in files:
+          os.symlink('%s/%s'   % (root, i),
+                     '%s%s/%s' % (dst, re.sub(src, '', root), i))
+          file_c += 1
+        for i in dirs:
+          try:
+            os.mkdir('%s%s/%s' % (dst, re.sub(src, '', root), i))
+          except OSError:
+            pass
+          dirs_c += 1
+        sys.stdout.write('> %-53s %6d dirs %6d files\r' % (
+          src_b[:52], # basename of src
+          dirs_c,                          # Dir count
+          file_c))                         # File count
+        sys.stdout.flush()
+
+  sys.stdout.write('> %-53s %6d dirs %6d files\n' % (
+    src_b[:52], # basename of src
+    dirs_c,  # Dir count
+    file_c)) # File count
+  sys.stdout.flush()
+except OSError as msg:
+  print(msg)
+  sys.exit(0)

History