Normalmente, desarquivo as coisas, $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
mas às vezes fico preguiçoso e faço isso em uma pasta arbitrária $ unzip *.zip
, de vez em quando mexendo com outro conteúdo. Vou listar aqui alguns métodos - algumas versões de arquivo certamente possuem sinalizadores de baixa qualidade, enquanto outras são mais espartanas, estou mais interessado nesse último.
Algumas maneiras de desarquivar, existem outras?
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;
As fraquezas são que ele lista os*.zip
diretórios; portanto, você deve usar devagar-ok
, devagar com muitas*.zip
correspondências e, por algum motivo, parece não corresponder a tudo que foi extraído.Se houver uma pequena quantidade de arquivos extraídos, um por um, lento, pesado e propenso a erros.
Quando quero ter certeza de que o conteúdo do arquivo é realmente uma pasta, às vezes verifico se
$ unzip -l *.bsd
funciona pelo menos na versão descompactada do obsd.
Se você estiver se referindo a determinadas ferramentas de arquivamento, indique-as quando apropriado. Porém, mantenha as coisas simples - estou mais interessado nas maneiras de como você faz isso do que em uma única ferramenta.
fonte
mkdir; unzip
coisas, para que eu nunca tenha preguiça de fazê-lo! svn.mikelward.com/svn/scripts/untarRespostas:
Por nome
Você pode gerar a lista de arquivos no arquivo morto e excluí-los, embora isso seja irritantemente complicado com arquivadores como descompactar ou 7z que não têm uma opção para gerar uma lista simples de nomes de arquivos. Mesmo com o tar, isso pressupõe que não há novas linhas nos nomes dos arquivos.
Em vez de remover os arquivos, você pode movê-los para o destino pretendido.
Usando o FUSE
Em vez de depender de ferramentas externas, você pode (na maioria das unidades) usar o FUSE para manipular arquivos usando comandos comuns do sistema de arquivos.
Você pode usar o Fuse-zip para espiar um zip, extraí-lo com
cp
, listar seu conteúdofind
, etc.O AVFS cria uma exibição de toda a hierarquia de diretórios, na qual todos os arquivos possuem um diretório associado (mesmo nome com # alinhado no final) que parece conter o conteúdo do arquivo.
Por data
Supondo que não tenha havido outra atividade na mesma hierarquia que sua extração, você pode informar os arquivos extraídos pelo ctime recente . Se você acabou de criar ou mover o arquivo zip, poderá usá-lo como ponto de corte; caso contrário, use
ls -lctr
para determinar um tempo de corte adequado. Se você deseja ter certeza de não remover os zíperes, não há motivo para fazer qualquer aprovação manual:find
é perfeitamente capaz de excluí-los. Aqui estão exemplos de comandos usando zsh oufind
; note que as primárias-cmin
e-cnewer
não estão no POSIX, mas existem no Linux (e outros sistemas com localização GNU), * BSD e OSX.Com o GNU find, FreeBSD e OSX, outra maneira de especificar o tempo de corte é criar um arquivo e usá-lo
touch
para definir seu mtime para o tempo de corte.Em vez de remover os arquivos, você pode movê-los para o destino pretendido. Aqui está uma maneira de encontrar o GNU / * BSD / OSX, criando diretórios no destino, conforme necessário.
Equivalente a Zsh (quase: este reproduz toda a hierarquia de diretórios, não apenas os diretórios que conterão arquivos):
Aviso, não testei a maioria dos comandos nesta resposta. Sempre revise a lista de arquivos antes de remover (execute
echo
primeiro e, em seguida,rm
se estiver ok).fonte
Estou me sentindo idiota, de qualquer maneira, coçei a cabeça para escrever esse script quando tive um problema semelhante. Eu usei
cpio
com a-it
bandeira para obter uma lista de arquivos; você pode usar comandos equivalentes para outros arquivadores. A parte complicada é que o arquivo cpio é de um initrd e eu extraí para/
, muitas pastas e arquivos têm o mesmo nome que em um sistema em funcionamento. Felizmente, o cpio não substituiu nenhum dos meus arquivos existentes. Uso uma verificação de tempo para garantir que não exclua nada que existia antes do comando errado.fonte
Que tal alimentar a lista de arquivos no arquivo morto
xargs rm
?Isso seria
tar -tf tarbomb.tar | xargs rm
ouunzip --list zipbomb.zip | xargs rm
.fonte
xargs
espera que sua entrada seja citada de uma maneira peculiar quefind
não produza. Usexargs -I rm {}
para que o xargs processe um item por linha. Para o comando descompactar, que implementação você tem? O Mine (Debian / Ubuntu) não possui--list
apenas-l
e não apenas imprime nomes de arquivos, sendo necessário um processamento extra.find
. 3) você está certounzip
, não testei e parece não haver opção para listagens não decoradas. Não--list
no meu Ubuntu também - eu apenas não testei.tar -t
porfind
. Mas meus outros pontos permanecem. Existe um risco real de que o seu comando, conforme fornecido, exclua um arquivo não relacionado.tar -tf tarbomb.tar
imprimirá os nomes dos arquivos um por linha, para que você possa fazertar -tf tarbomb.tar | while IFS=$'\n' read -r filename; do rm "$filename"; done
ou algo semelhante.Não é exatamente o que você pediu, mas como usar um script "descompacte tudo" em vez de.
Dessa forma, a saída de cada arquivo entra em seu próprio diretório.
fonte
Eu uso a seguinte função no zsh:
Ou seja, substituição de comando para remover todos os arquivos na saída limpa de
unzip -l
.tar tvf
poderia ser usado de maneira semelhante.fonte