Extraia vários arquivos zip, cada um em uma nova pasta com o mesmo nome, via terminal Ubuntu

37

Eu tenho muitos arquivos zip a.zip, b.zip, c.zip, ... e quero extrair cada um deles para novas pastas a, b, c, ... respectivamente, via terminal.

Na verdade, o que eu quero é uma solução que eu possa usar posteriormente com um findporque eu realmente tenho muitas pastas 2014, 2013, 2012, ... cada uma delas contendo muitos arquivos zip a.zip, b.zip, etc. find . -name "*.zip" -exec {} unzip \;descompactará todos os arquivos e os colocará em sua respectiva pasta pai.

Michael
fonte

Respostas:

72

Você deve poder usar a -dopção de descompactar para definir um diretório alternativo para o conteúdo do arquivo.

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

e assim por diante. Dentro de uma findexpressão, você deve conseguir derivar o nome do diretório do nome do arquivo zip usando a expansão de parâmetros do shell, por exemplo

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

Teste primeiro adicionando um echoie

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

ou algo parecido

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)
chave de aço
fonte
2
+1 para a test it first…peça
mrzmyr 04/12/19
2
findprecisa de um diretório, entãofind . -name ...
slf
@slf POSIXly, sim - mas não no caso do GNU find( "Se nenhum ponto de partida for especificado, .é assumido." )
steeldriver
10

Eu mesmo vim procurar isso, apenas para perceber que já havia feito isso com outros comandos e que poderia ser aplicado a praticamente qualquer outra coisa, do jeito que já estava fazendo.

O método find é muito complicado, sem nenhuma razão.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done
kencinder
fonte
Esta é, sem dúvida, a melhor resposta para a pergunta em questão. O anterior é ridículo e o seguinte não classifica os arquivos nas respectivas pastas raiz.
TheMegolith 6/03
Como alguém criaria o diretório sem o .zipsufixo? Pedindo um amigo.
dashard 15/04
A resposta não cria um diretório com um sufixo .zip, que é o próprio ponto da parte entre chaves.
kencinder 15/04
6

Simplesmente use

unzip '*.zip' -d /home/user/folder/
James Muller
fonte
11
A menos que eu estou faltando alguma coisa, isso irá descompactar tudo em / / pasta de usuário / home, não em / home / user / pasta / a e / home / user / pasta / b
M. Justin
1

Eu também precisava fazer isso usando o unrar. Isso pode ser conseguido com uma pequena modificação no código do kencinder.

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

PS: Eu queria adicionar isso como um comentário, mas não tenho pontos de reputação suficientes!

Atul Singh Arora
fonte