目前我正在使用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完成的吗?
答案 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