2012-01-26 32 views
2

目前我使用s3cmd ls s3://location/ > file.txt來獲取我的s3存儲桶的內容列表並保存在txt文件中。但是,以上返回日期,文件化路徑和文件名。s3cmd內容列表 - 只有文件名 - perl一個班輪?

例如:

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

我只需要在S3存儲的文件名 - 等上面的例子中,我只需要picture_1.jpg
有什麼建議嗎?

這可以用Perl一個班輪完成,也許在初始導出後?

+0

在你不知道的情況下,有CPAN模塊,以方便的編程訪問S3,例如網::亞馬遜:: S3。所以不要打電話給s3cmd,你可以調出相關的方法。 – zgpmax

回答

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 
0

我相信一個特定的模塊是更安全的選擇,但如果數據是可靠的,你可以逃脫一個oneliner:

假設輸入爲:

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#(?<=//)([^/]+)$#' 
  • -lchomp S上的輸入,並增加了新行結束的print聲明
  • -n增加了周圍的腳本while(<>)循環
  • (?<=//)向後斷言找到一個雙斜槓
  • ...其後以非斜槓結束行
  • for循環向我們保證不打印不匹配。

-n選項的好處是這個單線程可用於管道或文件中。

command | perl -lnwe '...' 
perl -lnwe '...' filename 
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