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 sed
erhalten Sie die ersten 30 Zeichen:
sed 's|\(.\{30\}\).*|\1|'
und verwenden Sie das stattdessen cut
in Ihrer for
Schleife.
Die Aufschlüsselung dieser sed
Ersetzung 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.