view go/imgtgz.go @ 15:c262e17de9b1

db download skip-mode.
author pyon@macmini
date Sat, 08 Jun 2019 15:50:59 +0900
parents d3b8cd5aeb70
children
line wrap: on
line source

/*	imgtgz
	[usage(1) archive images.]
	 $ mkdir 20170707
	 $ cd 20170707
	 $ ./imgtgz /mnt/nas/2017/20170702/xxxxx/0300012345

	[usage(2) list directory.( for archive )]
	 $ cd /mnt/nas/2017/20170702
	 $ ./imgtgz -l
 */
package main

import (
    "archive/tar"
    "compress/gzip"
    "fmt"
    "io"
    "log"
    "os"
    "path/filepath"
    "regexp"
    "strings"
)


func main() {
	if len( os.Args ) == 1 {
		help := `
	[usage(1) archive images.]
	 $ mkdir 20170707
	 $ cd 20170707
	 $ ./imgtgz /mnt/nas/2017/20170702/xxxxx/0300012345

	[usage(2) list directory.( for archive )]
	 $ cd /mnt/nas/2017/20170702
	 $ ./imgtgz -l
`
		fmt.Fprintf( os.Stderr, help )
		os.Exit( 1 )
	}

	if strings.Compare( os.Args[1], "-l" ) == 0 {
		list_dir()
		os.Exit( 0 )
	}

	hdir := os.Args[1] //hdir := "Y:\\2014\\20141030\\角館2\\0100072890"
	do_archive( hdir )
}

func list_dir() {
	r, err := regexp.Compile( "0[1238][0-9]{8}$" )
	if err != nil {
		log.Fatal( err )
	}

	filepath.Walk( ".", func( path string, info os.FileInfo, err error ) error {
		if info.IsDir() && r.MatchString( path ) {
			p, _ := filepath.Abs( "." )
			p = filepath.Join( p, path )
			p =  filepath.FromSlash( p )
			fmt.Println( p )
		}
		return nil
	} )
}

func do_archive( hdir string ) {
	r, err := regexp.Compile( "0[1238][0-9]{8}$" )
	if err != nil {
		log.Fatal( err )
	}
	m := r.FindString( hdir )
	if len( m ) == 0 {
		log.Fatal( err )
	}

	var images []string

	fi, _ := os.Stat( hdir )
	if fi.IsDir() {
		filepath.Walk( hdir, func( path string, info os.FileInfo, err error ) error {
			if !info.IsDir() && strings.HasSuffix( path, "jpg" ) {
				images = append( images, path )
			}
			return nil
		} )
	} else {
		fmt.Fprintf( os.Stderr, "%s: not directory\n", hdir )
		log.Fatal( err )
	}

	tar_gzip( m + ".tgz", images )
}

func tar_gzip( tgzfile string, images []string ) {

    tgz, err := os.Create( tgzfile )
    if err != nil {
        log.Fatal( err )
    }
    defer tgz.Close()

    gw := gzip.NewWriter( tgz )
    defer gw.Close()
    tw := tar.NewWriter( gw )
    defer tw.Close()

    for i, file := range images {
        f, err := os.Open( file )
        if err != nil {
            log.Fatal( err )
        }

        stat, _ := f.Stat()
        header := new( tar.Header )
        header.Name = fmt.Sprintf( "%d.jpg", i )
        header.Size = stat.Size()
        header.Mode = int64( stat.Mode() )
        header.ModTime = stat.ModTime()

        if err := tw.WriteHeader( header ); err != nil {
            log.Fatal( err )
        }
        if _, err := io.Copy( tw, f ); err != nil {
            log.Fatal( err )
        }
        f.Close()
    }
}