s3cmd список содержимого - только имена файлов - perl один вкладыш?

В настоящее время я использую s3cmd ls s3://location/ > file.txt, чтобы получить список содержимого моего ведра s3 и сохранить в txt. Однако приведенное выше возвращает даты, пути файлов и имена файлов.

Например:

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

Мне нужны только имена файлов ведра s3, поэтому в приведенном выше примере мне нужны только picture_1.jpg.
Есть предложения?

Можно ли это сделать с помощью одного вкладыша Perl, возможно, после первоначального экспорта?


person user1171048    schedule 26.01.2012    source источник
comment
Если вы еще не знали, существуют модули CPAN для облегчения программного доступа к S3, например. Сеть::Амазонка::S3. Таким образом, вместо вызова s3cmd вы можете просто вызвать соответствующий метод.   -  person zgpmax    schedule 26.01.2012


Ответы (3)


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
person daxim    schedule 26.01.2012

Используйте авк:

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
person Constantine    schedule 03.12.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 chomps ввод и добавляет новую строку в конец print операторов
  • -n добавляет цикл while(<>) вокруг скрипта
  • (?<=//) проверка назад находит двойную косую черту
  • ...за которым следует не косая черта до конца строки
  • Цикл for гарантирует, что несовпадения не печатаются.

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

command | perl -lnwe '...'
perl -lnwe '...' filename
person TLP    schedule 26.01.2012