3 Stimmen

S3cmd Liste der Inhalte - nur Dateinamen - Perl Einzeiler?

Derzeit verwende ich s3cmd ls s3://location/ > file.txt, um eine Liste der Inhalte meines S3-Buckets zu erhalten und in einer txt-Datei zu speichern. Allerdings liefert das obige Datumsangaben, Dateigrößen, Pfade und Dateinamen zurück.

Zum Beispiel:

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

Ich brauche nur die Dateinamen des S3-Buckets - also im obigen Beispiel benötige ich nur picture_1.jpg.
Irgendwelche Vorschläge?

Könnte dies eventuell mit einem Perl-Codezeiler nach dem initialen Export erledigt werden?

5voto

Constantine Punkte 659

Verwenden Sie awk:

s3cmd ls s3://location/ | awk '{ print $4 }' > file.txt

Wenn Sie Dateinamen mit Leerzeichen haben, versuchen Sie:

s3cmd ls s3://location/ | awk '{ s = ""; for (i = 4; i <= NF; i++) s = s $i " "; print s }' > file.txt

2voto

daxim Punkte 38607

File::Listing unterstützt dieses Format nicht, weil die Designer dieses Listenformats dumm genug waren, um nicht einfach ein vorhandenes zu verwenden. Lassen Sie uns es stattdessen manuell parsen.

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

Als Oneliner:

perl -mURI -lne 'print ((URI->new((split q( ), $line)[-1])->path_segments)[-1])' < input

0voto

TLP Punkte 65295

Ich bin mir sicher, dass ein spezifisches Modul die sicherere Option ist, aber wenn die Daten zuverlässig sind, kannst du mit einem Einzeiler davonkommen:

Angenommen, die Eingabe ist:

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
...

Der Einzeiler:

perl -lnwe 'print for m#(?<=//)([^/]+)$#'
  • -l entfernt das Zeilenende und fügt ein neues Zeilenende für print hinzu
  • -n fügt eine while(<>)-Schleife um das Skript hinzu
  • (?<=//) positive Rückwärtsprüfung findet doppelten Schrägstrich
  • ...gefolgt von Nicht-Schrägstrichen bis zum Ende der Zeile
  • Die for-Schleife stellt sicher, dass Nicht-Übereinstimmungen nicht gedruckt werden.

Der Vorteil der -n Option ist, dass dieser Einzeiler in einem Pipe oder auf einer Datei verwendet werden kann.

Befehl | perl -lnwe '...'
perl -lnwe '...' Dateiname

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X