Extrahieren Sie ZIP-Dateien in ein Verzeichnis basierend auf dem Muster des ZIP-Namens

Extrahieren Sie ZIP-Dateien in ein Verzeichnis basierend auf dem Muster des ZIP-Namens

Ich habe diese Zip-Dateien:

PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip

Und ich brauche jede Zip-Datei in das entsprechende Verzeichnis und in diesem Format (im Grunde brauche ich nur die ersten 30 Zeichen):

PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03

Dies ist der Befehl, den ich derzeit habe. Er funktioniert, aber nur für die zweite Zip-Datei (PLP_634562_2004-03-02_02-15-07_UBIC.zip).

for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done

Ich möchte es so ändern, dass es nur die ersten 30 Zeichen der Zip-Datei liest und dann das Verzeichnis darauf basierend erstellt. Dadurch wird sichergestellt, dass jedes neue Benennungsformat für Zip-Dateien in Zukunft funktioniert.

Ich habe versucht, den n-Variablenteil des Befehls wie folgt zu ändern

n=$(echo ${f:0:30}); 

aber das hat nicht funktioniert. Ich verwende Linux Bash.

Antwort1

Mit sederhalten Sie die ersten 30 Zeichen:

sed 's|\(.\{30\}\).*|\1|'

und verwenden Sie das stattdessen cutin Ihrer forSchleife.

Die Aufschlüsselung dieser sedErsetzung besteht darin, dass das, was zwischen \( \)Ihnen übereinstimmt, durch ersetzt wird \1. Das {30}(mit maskierte \) zählt 30 einzelne Zeichen ( .).

Antwort2

Vielen Dank für alle Vorschläge. Ich habe Teile von allen Vorschlägen übernommen und diesen Befehl erstellt. In meinem Fall ist dies genau der Befehl, den ich benötigte.

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • Es durchläuft alle Zip-Dateien
  • Gibt jede Zip-Datei aus (nur den Dateinamen, es werden keine zusätzlichen Informationen wie Größe oder Pfad angezeigt) und zeigt dann nur die ersten 30 Zeichen an und speichert sie in einer Variablen
  • Anschließend extrahiert es den Inhalt jeder ZIP-Datei in ein neues Verzeichnis (unter Verwendung der Variable n).

In meinem Fall habe ich dies in ein Skript eingefügt, das von einem anderen Verzeichnis aus ausgeführt wird.

verwandte Informationen