2

現在s3cmd ls s3://location/ > file.txt、s3バケットの内容のリストを取得してtxtに保存するために使用しています。ただし、上記は日付、ファイルサイズのパス、およびファイル名を返します。

例えば:

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

s3 バケットのファイル名だけが必要なので、上記の例ではpicture_1.jpg.
助言がありますか?

おそらく最初のエクスポートの後に、Perl のワンライナーでこれを行うことができますか?

4

3 に答える 3

5

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
于 2012-12-03T17:39:01.440 に答える
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

ワンライナーとして:

perl -mURI -lne 'print ((URI->new((split q( ), $line)[-1])->path_segments)[-1])' < input
于 2012-01-26T13:29:06.360 に答える
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 chompprints入力し、ステートメントの最後に改行を追加します
  • -nwhile(<>)スクリプトの周りにループを追加します
  • (?<=//)ルックビハインドアサーションはダブルスラッシュを検出します
  • ...行末までスラッシュなしが続きます
  • ループは、for不一致が出力されないことを保証します。

このオプションの利点は-n、このワンライナーをパイプまたはファイルで使用できることです。

command | perl -lnwe '...'
perl -lnwe '...' filename
于 2012-01-26T15:51:45.387 に答える