s3cmd список содержимого - только имена файлов - perl one liner? - PullRequest
2 голосов
/ 26 января 2012

В настоящее время я использую 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 ]

4 голосов
/ 03 декабря 2012

Используйте 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
2 голосов
/ 26 января 2012

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
0 голосов
/ 26 января 2012

Я уверен, что конкретный модуль является более безопасным вариантом, но если данные надежны, вы можете обойтись без однострочного:

Предполагая, что ввод:

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 s ввод и добавление новой строки в конец print операторов
  • -n добавляет while(<>) зацикливание вокруг сценария
  • (?<=//) при проверке с указанием взгляда обнаруживается двойная косая черта
  • ..., за которой следует не косая черта до конца строки
  • for loop гарантирует, что несоответствия не будут напечатаны.

Преимущество опции -n заключается в том, что этот однострочный текст может использоваться в канале или в файле.

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