agrupa arquivos em partes de tamanho fixo

2

Exemplo: Digamos que eu tenha 20 mil imagens e que eu precise agrupá-las em pastas para gravá-las em um CD (máximo de 700 MB / pasta).

Geral: Eu tenho N arquivos e preciso agrupá-los em grupos M, para que todos os grupos tenham aproximadamente o mesmo tamanho (o mais próximo possível)

dividindo-se em grupos M ou dividindo-se em grupos de tamanho M ... qualquer seria ótimo

Parece uma tarefa tão fácil ... mas, como posso fazer isso?

    
por Tancredi-Paul Grozav 04.12.2015 / 13:33

1 resposta

1

Suposições: você deseja dividir uma pasta contendo milhares de arquivos, totalizando até mais de 700MB, em diretórios individuais de 700 MB cada - prontos para serem gravados em vários CDs.

No Linux, você pode usar um script como dsplit ou dirsplit - parte do genisoimage (no Debian / Ubuntu). Se você preferir Windows / Wine, você pode usar um aplicativo como Folder Axe .

Exemplos

Cenário de teste

# Create 2000 files of 1MB (sparse) each.
mkdir allimages && cd $_
for i in {1..2000}
do 
     dd if=/dev/zero of=image$i.jpg bs=1 count=0 seek=1M
done

Agora tenho 2000 arquivos (2 GB) que quero dividir em três diretórios.

$ ls -la | tail
-rw-rw-r--  1 cmihai cmihai 1048576 Dec  4 12:54 image992.jpg
-rw-rw-r--  1 cmihai cmihai 1048576 Dec  4 12:54 image993.jpg

Instale o dirsplit. No Ubuntu, isso está incluído no pacote genisoimage .

$ apt-cache search dirsplit
genisoimage - Creates ISO-9660 CD-ROM filesystem images

$ sudo apt-get install genisoimage

dirsplit

# Get usage / help
dirsplit -H

# Dry run (get list of changes):
dirsplit --no-act --size 700M --expmode 1 allimages/

# Actual run:
$ dirsplit --size 700M --expmode 1 allimages/
Building file list, please wait...
Calculating, please wait...
....................
Calculated, using 3 volumes.
Wasted: 105254 Byte (estimated, check mkisofs -print-size ...)

# List of files per directory can be found in catalog files you can use with mkisofs.
$ ls
allimages  vol_1.list  vol_2.list  vol_3.lis

dsplit

Observação: por padrão, os arquivos são vinculados à fonte

$ wget https://raw.githubusercontent.com/mayanez/dsplit/master/dsplit.py

$ python dsplit.py -s 700 -v allimages/ out/
Volume 01:
  allimages/: 700 files (700.00 MB).
Total: 700.00 MB (700 files, 1 dirs)
Volume 02:
  allimages/: 700 files (700.00 MB).
Total: 700.00 MB (700 files, 1 dirs)
Volume 03:
  allimages/: 600 files (600.00 MB).
Total: 600.00 MB (600 files, 1 dirs)

Gotchas:

  • Eu usei arquivos esparsos no meu teste - você vai querer verificar como o dsplit / dirsplit lida com arquivos esparsos, hardlinks e softlinks.
por 04.12.2015 / 13:48