\d+ \s+ # ignore size
([-bcdlps]) # 1. File type
( [-r][-w][-xsS] # 2. user-permissions
- [-r][-w][-xsS] # 3. group-permissions
- [-r][-w][-xtT] ) \s+ # 4. other-permissions
+ [-r][-w][-xsS] # group-permissions
+ [-r][-w][-xtT] ) \s+ # other-permissions
\d+ \s+ # ignore number of links
- (\S+) \s+ # 5. owner
- (\S+) \s+ # 6. group
+ (\S+) \s+ # 3. owner
+ (\S+) \s+ # 4. group
(?: \d+ \s+ )? # ignore size (when present)
\w+ \s+ \d+ \s+ # ignore month and date
\d+ (?: : \d+ )? \s+ # ignore time or year
- ([^\r\n]+) $ # 7. name
+ ([^\r\n]+) $ # 5. name
}x;
while (<>) {
die "Invalid input line $.:\n$_" unless defined $name;
die "A filename is not properly escaped:\n$_" unless $name =~ /^[^"\\]*(\\(\d\d\d|\D)[^"\\]*)*$/;
my $fn = $name;
- $fn =~ s/([\$\@\%])/\\$1/g;
- $fn = eval "\"$fn\"";
+ $fn =~ s/\\(\d+|.)/ eval "\"\\$1\"" /eg;
if ($type eq '-') {
undef $type unless -f $fn;
} elsif ($type eq 'd') {