Estrai diversi file zip, ognuno in una nuova cartella con lo stesso nome, tramite il terminale Ubuntu


37

Ho molti file zip a.zip, b.zip, c.zip, ... e voglio estrarre ciascuno di essi in nuove cartelle a, b, c, ... rispettivamente, tramite terminale.

In realtà, quello che voglio è una soluzione che posso usare in seguito con a findperché in realtà ho molte cartelle 2014, 2013, 2012, ... ognuna contenente molti file zip a.zip, b.zip, ecc. Se lo faccio find . -name "*.zip" -exec {} unzip \;decomprimerà tutti i file e li inserirà nella rispettiva cartella principale.


Risposte:


72

Dovresti essere in grado di utilizzare l' -dopzione di decompressione per impostare una directory alternativa per i contenuti dell'archivio.

unzip -d a a.zip
unzip -d b b.zip

e così via. All'interno di findun'espressione, dovresti essere in grado di derivare il nome della directory dal nome del file zip usando l'espansione dei parametri della shell, ad es.

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Provalo prima aggiungendo un echoie

find -name '*.zip' -exec sh -c 'echo unzip -d "${1%.*}" "$1"' _ {} \;

o qualcosa del genere

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)

2
+1 per la test it first…parte
mrzmyr

2
findha bisogno di una directory, quindifind . -name ...
slf

@slf POSIXly, yes - ma non nel caso di GNU find( "Se non viene specificato un punto di partenza, .si assume." )
steeldriver

10

Sono venuto a cercarlo da solo, solo per rendermi conto che l'avevo già fatto con altri comandi e poteva essere applicato praticamente a qualsiasi altra cosa, come lo stavo già facendo.

Il metodo find è folle e complicato senza motivo.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done

Questa è senza dubbio la migliore risposta alla domanda in corso. Il precedente è ridicolo e quello successivo non si ordina nei file delle rispettive cartelle principali.
TheMegolith

Come si potrebbe creare la directory senza il .zipsuffisso? Chiedere un amico.
Dashard,

La risposta non crea una directory con un suffisso .zip, ovvero il punto stesso della porzione all'interno delle parentesi graffe.
kinder

6

Usa semplicemente

unzip '*.zip' -d /home/user/folder/

11
A meno che non mi manchi qualcosa, questo decomprimerà tutto in / home / utente / cartella, non in / home / utente / cartella / ae / home / utente / cartella / b
M. Giustino

1

Ho anche dovuto farlo usando unrar. Ciò può essere ottenuto modificando leggermente il codice di Kencinder.

for i in *.rar; do mkdir "${i%%.rar}"; unrar x -r "$i" "${i%%.rar}"; done 

PS: volevo aggiungere questo come commento ma non ho abbastanza punti reputazione!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.