一个用FTP批量上传文件的perl脚本,支持目录上传

有时候需要在字符界面下上传文件,尤其是自动上传。

本脚本可以自动判断要上传的是文件还是目录,如果是文件直接上传,如果是目录则递归上传。

自己觉得,写的十分的不优雅,比较Ugly...

代码:

   1   # !/usr/bin/perl -w
   2
  
3   #  Procedure Name: ftpupload.pl
   4   #  Author        : Felix New ( felix@hebut.org )
   5   #  Date          : 2007-11-27
   6   #
   7   #  Usage: ftpupload.pl server username password  save_dir {file|dir}
   8   #              where:
   9   #                 server   - name of remote machine
  10   #                 username - ftp username on remote machine
  11   #                 password - password for username on remote machine
  12   #                 save     - save directory / directory, default to user's root
  13   #                 file     - local file for upload
  14   #                 dir      - local dir for upload
  15   #
  16   #  modify:
  17   #  Author        : Felix New (felix@hebut.org)
  18   #  Date          : 2007-12-06
  19   #  Comment       : Add function judge the item is a file or directory,
  20   #                    if the last onw then upload the directory recursivly.
  21
 
22
 
23   use  strict;
 
24   use  Net :: FTP;
 
25   use  File :: Basename;
 
26   use  File :: Spec :: Functions;
 
27
 
28  $ |   =   1 ;
 
29   my   $prog   =   ' ftpupload.pl ' ;
 
30
 
31
 
32   # #############################
  33   # ##       Main  Start      ###
  34   # #############################
  35
 
36   # ## get arguments
  37
 
38   if  ( $ # ARGV < 4 )
  39  {
 
40       print   " Usage: $prog server username password save_dir {file|directoyr}... " ;
 
41       die   " Argument error! " ;
 
42  }
 
43
 
44   my  ( $srv ,   $usr ,   $pwd ,   $remoteDir ,   @files );
 
45   $srv   =   shift   @ARGV ;
 
46   $usr   =   shift   @ARGV ;
 
47   $pwd   =   shift   @ARGV ;
 
48   $remoteDir   =   shift   @ARGV ;
 
49
 
50
 
51   # #############################
  52   # ##       Main  Start      ###
  53   # #############################
  54
 
55
 
56   # ## create ftp and upload file
  57   print   " ftp:   $srv: " ;
 
58   print   " ftp directory: $remoteDir " ;
 
59   print   " localfiles: @ARGV ############ " ;
 
60
 
61   my   $ftp   =  new Net :: FTP(  $srv ,  Passive  =>   1 ,  BlockSize  =>   81920 ,  Timeout  =>   300 ,  Debug  =>   0 );
 
62
 
63   $ftp -> login( $usr ,   $pwd ) or  die   " Can't not login " ,   $ftp -> message ,   " " ;
 
64   $ftp -> binary;
 
65
 
66   & init();
 
67
 
68
 
69   foreach   my   $arg  ( @ARGV )
 
70  {
 
71       if  ( - $arg )
 
72      {
 
73           & upload( glob   " $arg/* " );
 
74      } else
 
75      {
 
76           & upload( $arg );
 
77      }
 
78  }
 
79
 
80   $ftp -> quit();
 
81
 
82
 
83   # #############################
  84   # ##    Main     End        ###
  85   # #############################
  86
 
87   sub  upload()
 
88  {
 
89       foreach   my   $item  ( @_ )
 
90      {
 
91           next   if  ( $item   =~   /. $ / );
 
92           next   if  ( $item   =~   /.. $ / );
 
93
 
94           next   if   !   $item ;
 
95           $item   =~  s //* $ // g;
 
96
 
97           # ## the director is exists?
  98           my   $basename   =  basename( $item );
 
99           my   $dirname   =  dirname( $item );
100
101           if - $item )
102          {
103               print   " directory: $item " ;
104
105               # ## check the basename exists
106               my   @list = $ftp -> ls();
107               my   $count   =   0 ;
108               while  (  $count   <=  $ # list )
109              {
110                   if  (  $list [ $count ] eq  $basename )
111                  {    # ## exists
112                       last ;
113                  }
114                   $count ++ ;
115              }
116
117               # # the directory is not exists
118               if  ( $count   >  $ # list)
119              {
120                   $ftp -> mkdir ( $basename );
121                   print   " create $basename. " ;
122              }
123               $ftp -> cwd( $basename );
124
125               my   @subitem   =   glob   " $item/* " ;
126               & upload( @subitem );
127               $ftp -> cdup();
128          } else
129          {
130               $ftp -> put( $item ) or ( print   " upload file $item failed " ,   $ftp -> message ,   " "  and  next );
131               print   " $item ok. " ;
132          }
133      }
134  }
135
136   sub  init()
137  {
138       my   $tmpdir   =   $remoteDir ;
139
140       $tmpdir   =~  s //* $ // g;
141
142       while (( my   $offsize   =   index ( $tmpdir ,   ' / ' ))  >   0 )
143      {
144           $tmpdir   =~  s /^/*// g;
145           my   $checkdir   =   substr ( $tmpdir ,   0 ,   $offsize );
146
147           my   @list = $ftp -> ls();
148           my   $count   =   0 ;
149           while  (  $count   <=  $ # list )
150          {
151               if  (  $list [ $count ] eq  $checkdir )
152              {    # ## exists
153                   last ;
154              }
155               $count ++ ;
156          }
157
158           # # the directory is not exists
159           if  ( $count   >  $ # list)
160          {
161               $ftp -> mkdir ( $checkdir );
162               print   " create $checkdir. " ;
163          }
164           $ftp -> cwd( $checkdir );
165           $tmpdir   =   substr ( $tmpdir ,   $offsize   +   1 );
166      }
167
168       if ( $tmpdir )
169      {
170           my   @list = $ftp -> ls();
171           my   $count   =   0 ;
172           while  (  $count   <=  $ # list )
173          {
174               if  (  $list [ $count ] eq  $tmpdir )
175              {    # ## exists
176                   last ;
177              }
178               $count ++ ;
179          }
180
181           # # the directory is not exists
182           if  ( $count   >  $ # list)
183          {
184               $ftp -> mkdir ( $tmpdir );
185               print   " create $tmpdir. " ;
186          }
187           $ftp -> cwd( $tmpdir );
188      } else
189      {
190           # ## if $remoteDir is '/'
191           $ftp -> cwd( $remoteDir if   !   $tmpdir ;
192      }
193  }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值