s3cmd内容列表 - 只有文件名 - perl one liner?

时间:2012-01-26 10:37:30

标签: perl s3cmd

目前我正在使用s3cmd ls s3://location/ > file.txt来获取我的s3存储桶的内容列表并保存在txt上。但是,上面的内容会返回日期,文件大小路径和文件名。

例如:

2011-10-18 08:52      6148   s3://location//picture_1.jpg

我只需要s3存储桶的文件名 - 所以在上面的示例中我只需要picture_1.jpg
有什么建议吗?

这可能是在初始导出后使用Perl one liner完成的吗?

3 个答案:

答案 0 :(得分:4)

使用awk:

s3cmd ls s3://location/ | awk '{ print $4 }' > file.txt

如果您的文件名包含空格,请尝试:

s3cmd ls s3://location/ | awk '{ s = ""; for (i = 4; i <= NF; i++) s = s $i " "; print s }' > file.txt

答案 1 :(得分:2)

File::Listing不支持这种格式,因为此列表格式的设计者非常愚蠢到不能简单地重用现有格式。让我们手动解析它。

use URI;
my @ls = (
    "2011-10-18 08:52 6148 s3://location//picture_1.jpg\n",
    "2011-10-18 08:52 6148 s3://location//picture_2.jpg\n",
    "2011-10-18 08:52 6148 s3://location//picture_3.jpg\n",
);

for my $line (@ls) {
    chomp $line;
    my $basename = (URI->new((split q( ), $line)[-1])->path_segments)[-1];
}

__END__
picture_1.jpg
picture_2.jpg
picture_3.jpg

作为oneliner:

perl -mURI -lne 'print ((URI->new((split q( ), $line)[-1])->path_segments)[-1])' < input

答案 2 :(得分:0)

我确信一个特定的模块是更安全的选择,但如果数据是可靠的,你可以使用单行代码:

假设输入为:

2011-10-18 08:52 6148 s3://location//picture_1.jpg
2011-10-18 08:52 6148 s3://location//picture_2.jpg
2011-10-18 08:52 6148 s3://location//picture_3.jpg
...

单线:

perl -lnwe 'print for m#(?<=//)([^/]+)$#'
  • -l chomp输入内容,并在print语句末尾添加换行符
  • -n在脚本
  • 周围添加while(<>)循环
  • (?<=//) lookbehind断言发现双斜线
  • ...后跟非斜线到行尾
  • for循环向我们保证不会打印不匹配。

-n选项的好处是这个单行可以在管道或文件中使用。

command | perl -lnwe '...'
perl -lnwe '...' filename