Bash - cria o zip encontrando arquivos

0

Eu quero criar um script bash que encontre *.mp4 e zip .

Eu uso isso:

#!/bin/sh
zip -r $(find . -name '*.mp4').zip $(find "/home/ehsan/Desktop" -name '*.pdf')

mas não funciona e obtém este erro:

zip error: Zip file structure invalid (./Bank_Mellat_v3.2_hassas-computer.com/Help.pdf)
    
por Ehsan 02.08.2015 / 14:33

3 respostas

2

Compactar todos os arquivos em um arquivo

Você pode compactar todos os arquivos com um nome de base correspondente a * .mp4 localizado no diretório atual em um único arquivo com o seguinte comando:

zip my_mp4_archive.zip $(find . -name "*.mp4")

Compactar cada arquivo em um arquivo próprio

O seguinte script irá zipar cada arquivo individualmente, no mesmo diretório que o arquivo em si é armazenado.

files=$(find . -name "*.mp4")

for f in $files; do
  echo "Compressing $f"
  (cd $(dirname $f) && zip $(basename $f.zip) $(basename $f))
done
    
por vindvaki 02.08.2015 / 14:52
2

zip sozinho pode fazer isso. Observe também que zip -os arquivos mp4 é ineficiente, já que não lhe dará nenhuma vantagem no que diz respeito ao espaço, pois já está no formato MPEG4 comprimido.

Para encontrar todos os arquivos .mp4 recursivamente a partir do diretório atual e salve-os como files.zip :

zip files.zip -r . -i '*.mp4'
  • -r denota operação recursiva

  • -i '*.mp4 especifica o único padrão em que estamos interessados

EDITAR:

Depois de ler seus comentários, parece que você deseja encontrar cada arquivo .mp4 e criar o zip desse arquivo apenas e também deseja fazer isso para todos os arquivos .mp4 de forma recursiva. Se assim for:

find . -type f -name '*.mp4' -exec bash -c 'zip "${1%.mp4}".zip "$1"' _ {} \;

Isso vai encontrar todos os arquivos .mp4 de forma recursiva no diretório atual e zip cada separadamente. Portanto, foo.mp4 será zip -ped como foo.zip . Mais uma vez você não terá qualquer vantagem de compressão.

    
por heemayl 02.08.2015 / 15:45
-1

Use isso para compactar todos os arquivos .mp4 no diretório base e seus subdiretórios.

$ zip test.zip 'find . -name \*.mp4 -print | tr "\n" " "'

Explicação :

Para compactar o arquivo zip file-name.zip path1 path2...

Para obter todos os caminhos de arquivos com .mp4 extension no diretório base e todos os subdiretórios usam find :

find . -name \*.mp4 -print

Para listar todas as saídas em uma linha separadas por space , como exigimos em nosso canal de comando zip por meio de tr "\n" " "

Colocando tudo junto:

$ zip test.zip 'find . -name \*.mp4 -print | tr "\n" " "'

Atualizar Depois de ler o comentário do OP:

Basta percorrer todos os nomes de caminho do arquivo .mp4 encontrado por exemplo:

for p in 'find . -name \*.mp4 -print'                                                                                                           
do
    zip $p.zip $p
done

Se o nome do arquivo contiver um caractere de espaço, você nos considera tr para substituir space por backslash space

Por exemplo: use $p | tr ' ' "\' '" em vez de $p .

    
por yask 02.08.2015 / 15:27