Class: Net::FTP::List::Unix
- Inherits:
-
Parser
- Object
- Parser
- Net::FTP::List::Unix
- Defined in:
- lib/net/ftp/list/unix.rb
Overview
Parse Unix like FTP LIST entries.
MATCHES
drwxr-xr-x 4 steve group 4096 Dec 10 20:23 etc
-rw-r--r-- 1 root other 531 Jan 29 03:26 README.txt
Constant Summary
- REGEXP =
Stolen straight from the ASF's commons Java FTP LIST parser library. svn.apache.org/repos/asf/commons/proper/net/trunk/src/java/org/apache/commons/net/ftp/
%r{ ([pbcdlfmpSs-]) (((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-])))\+?\s+ (\d+)\s+ (\S+)\s+ (?:(\S+(?:\s\S+)*)\s+)? (?:\d+,\s+)? (\d+)\s+ ((?:\d+[-/]\d+[-/]\d+)|(?:\S+\s+\S+))\s+ (\d+(?::\d+)?)\s+ (\S*)(\s*.*) }x- ONE_YEAR =
(60 * 60 * 24 * 365)
Class Method Summary (collapse)
-
+ (Object) parse(raw)
Parse a Unix like FTP LIST entries.
Class Method Details
+ (Object) parse(raw)
Parse a Unix like FTP LIST entries.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/net/ftp/list/unix.rb', line 30 def self.parse(raw) match = REGEXP.match(raw.strip) or return false dir, symlink, file, device = false, false, false, false case match[1] when /d/ then dir = true when /l/ then symlink = true when /[f-]/ then file = true when /[psbc]/ then device = true end return false unless dir or symlink or file or device # TODO: Permissions, users, groups, date/time. filesize = match[18].to_i mtime = Time.parse("#{match[19]} #{match[20]}") mtime -= ONE_YEAR if mtime > Time.now basename = match[21].strip # filenames with spaces will end up in the last match basename += match[22] unless match[22].nil? # strip the symlink stuff we don't care about basename.sub!(/\s+\->.+$/, '') if symlink emit_entry( raw, :dir => dir, :file => file, :device => device, :symlink => symlink, :filesize => filesize, :basename => basename, :mtime => mtime ) end |