view src/ut/lu/lu.go @ 17:72ce457fb99d

ut: bug fix.
author pyon@macmini
date Wed, 20 Jun 2018 06:01:58 +0900
parents 38b64afbaf79
children 45ca03520eea
line wrap: on
line source

/*
    little unix tool library.
*/
package lu

import (
    "archive/tar"
    "bufio"
    "bytes"
    "compress/gzip"
    "crypto/md5"
    "crypto/sha256"
    "fmt"
    "io"
    "log"
    "os"
    "os/exec"
    "path/filepath"
    "strings"
)

func CmdTime( cmdline string ) {
    cmd := exec.Command( "ls", "-l" )
	cmd.Stdin = strings.NewReader( "some input" )
	var out bytes.Buffer
	cmd.Stdout = &out
	err := cmd.Run()
	if err != nil {
		log.Fatal( err )
	}
	fmt.Printf( "%q\n", out.String() )
}

/* cut -d, -f: */
func CutCsv( files []string, cols []string ) {
}

/* cat -n: done. */
func Cat_n( files []string ) {
    if len( files ) == 0 {
        cnt := 1
        input := bufio.NewScanner( os.Stdin )
        for input.Scan() {
            fmt.Printf( "%5d  %s\n", cnt, input.Text() )
            cnt++
        }
    } else {
        for _, file := range files {
            cnt := 1
            f, _ := os.Open( file )
            input := bufio.NewScanner( f )
            for input.Scan() {
                fmt.Printf( "%5d  %s\n", cnt, input.Text() )
                cnt++
            }
            f.Close()
        }
    }
}

/* wc -l: done. */
func Wc_l( files []string ) {
    if len( files ) == 0 {
        cnt := 0
        input := bufio.NewScanner( os.Stdin )
        for input.Scan() {
            cnt++
        }
        fmt.Printf( "%d\n", cnt )
    } else {
        for _, file := range files {
            cnt := 0
            f, _ := os.Open( file )
            input := bufio.NewScanner( f )
            for input.Scan() {
                cnt++
            }
            f.Close()
            fmt.Printf( "%s:\t%5d\n", file, cnt )
        }
    }
}

/* tar cvfz: done. */
func Tgz( tgzfile string, files []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 _, file := range fullpath( files ) {
        f, err := os.Open( file )
        if err != nil {
            log.Fatal( err )
        }

        stat, _ := f.Stat()
        header := new( tar.Header )
        header.Name = file
        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()
    }
}

/* tar xvfz: done. */
func UnTgz( files []string ) {

    for _, file := range files {

        f, err := os.Open( file )
        if err != nil {
            log.Fatal( err )
        }
        zr, err := gzip.NewReader( f )
        if err != nil {
            log.Fatal( err )
        }

        tr := tar.NewReader( zr )

        for {
            hdr, err := tr.Next()
            if err == io.EOF {
                break // End of archive
            }
            if err != nil {
                log.Fatal( err )
            }
            fmt.Printf( "%s\n", hdr.Name )

            dir := filepath.Dir( hdr.Name )
            if ( dir != "" ) {
                os.MkdirAll( dir, 0744 )
            }
            f, err := os.OpenFile( hdr.Name, os.O_RDWR|os.O_CREATE, 0644 )
            if err != nil {
                log.Fatal( err )
            }
            if _, err := io.Copy( f, tr ); err != nil {
                log.Fatal( err )
            }

            if err := f.Close(); err != nil {
                log.Fatal( err )
            }
        }

        if err := zr.Close(); err != nil {
            log.Fatal( err )
        }
    }
}

func fullpath( files []string ) []string {
    var buf []string
    for _, f := range files {
        fi, _ := os.Stat( f )
        if fi.IsDir() {
            filepath.Walk( f, func( path string, info os.FileInfo, err error ) error {
                if !info.IsDir() {
                    buf = append( buf, path )
                }
                return nil
            } )
        } else {
            buf = append( buf, f )
        }
    }
    return buf
}

/* tac: done. */
func Reverse( files []string ) {
    var buf []string
    if len( files ) == 0 {
        input := bufio.NewScanner( os.Stdin )
        for input.Scan() {
            buf = append( buf, input.Text() )
        }
    } else {
        for _, file := range files {
            f, _ := os.Open( file )
            input := bufio.NewScanner( f )
            for input.Scan() {
                buf = append( buf, input.Text() )
            }
            f.Close()
        }
    }
    for i := len( buf ); i > 0; i-- {
        fmt.Println( buf[i-1] )
    }
}

func Grep( word string, inv bool, files []string ) {
    if len( files ) == 0 {
        fmt.Println("grep stdin")
    } else {
        fmt.Println("grep")
    }
}

/* uniq: done. */
func Uniq( cnt, dup bool, files []string ) {
    var lines []string
    lcnt := make( map[string]int )
    lpnt := make( map[string]bool )

    if len( files ) == 0 {
        input := bufio.NewScanner( os.Stdin )
        for input.Scan() {
            lines = append( lines, input.Text() )
            lcnt[ input.Text() ]++
        }
    } else {
        for _, file := range files {
            f, _ := os.Open( file )
            input := bufio.NewScanner( f )
            for input.Scan() {
                lines = append( lines, input.Text() )
                lcnt[ input.Text() ]++
            }
            f.Close()
        }
    }

    for _, line := range lines {
        if !lpnt[ line ] {
            if dup && lcnt[ line ] == 1 {
                continue
            }
            if cnt {
                fmt.Printf( "%5d  ,", lcnt[ line ] )
            }
            fmt.Printf( "%s\n", line )
            lpnt[ line ] = true
        }
    }
}

func Head( n int, files []string ) {
    if n > 0 {
        if len( files ) == 0 {
            input := bufio.NewScanner( os.Stdin )
            for input.Scan() {
                fmt.Println( input.Text() )
                n--
                if n == 0 {
                    return
                }
            }
        } else {
            for _, file := range files {
                if n == 0 {
                    return
                }
                f, _ := os.Open( file )
                input := bufio.NewScanner( f )
                for input.Scan() {
                    fmt.Println( input.Text() )
                    n--
                    if n == 0 {
                        break
                    }
                }
                f.Close()
            }
        }
    } else {
        if len( files ) == 0 {

        } else {

        }
    }
}

/* replace:  */
func Replace( s, t string, files []string ) {
    if len( files ) == 0 {
        input := bufio.NewScanner( os.Stdin )
        for input.Scan() {
        }
    } else {
        for _, file := range files {
            f, _ := os.Open( file )
            input := bufio.NewScanner( f )
            for input.Scan() {
            }
            f.Close()
        }
    }
}

/* touch:  */
func Touch( files []string ) {
    for _, file := range files {
        f, _ := os.Open( file )
        f.Close()
    }
}

/* md5: done. */
func Md5( files []string ) {
    for _, file := range files {
        f, _ := os.Open( file )
        h := md5.New()
        if _, err := io.Copy( h, f ); err != nil {
            log.Fatal( err )
        }
        f.Close()
        if len( files ) == 1 {
            fmt.Printf( "%x\n", h.Sum( nil ) )
        } else {
            fmt.Printf( "%s:\t%x\n", file, h.Sum( nil ) )
        }
    }
}

/* sha256: done.  */
func Sha256( files []string ) {
    for _, file := range files {
        f, _ := os.Open( file )
        h := sha256.New()
        if _, err := io.Copy( h, f ); err != nil {
            log.Fatal( err )
        }
        f.Close()
        if len( files ) == 1 {
            fmt.Printf( "%x\n", h.Sum( nil ) )
        } else {
            fmt.Printf( "%s:\t%x\n", file, h.Sum( nil ) )
        }
    }
}