github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/cmds/core/tar/tar.go (about) 1 // Copyright 2019 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Create and extract tar archives. 6 // 7 // Synopsis: 8 // tar [OPTION...] [FILE]... 9 // 10 // Description: 11 // This command line can be used only in the following ways: 12 // tar -cvf x.tar directory/ # create 13 // tar -cvf x.tar file1 file2 ... # create 14 // tar -tvf x.tar # list 15 // tar -xvf x.tar directory/ # extract 16 // 17 // Options: 18 // -c: create a new tar archive from the given directory 19 // -x: extract a tar archive to the given directory 20 // -v: verbose, print each filename (optional) 21 // -f: tar filename (required) 22 // -t: list the contents of an archive 23 // 24 // TODO: The arguments deviates slightly from gnu tar. 25 package main 26 27 import ( 28 "log" 29 "os" 30 31 flag "github.com/spf13/pflag" 32 "github.com/u-root/u-root/pkg/tarutil" 33 ) 34 35 var ( 36 create = flag.BoolP("create", "c", false, "create a new tar archive from the given directory") 37 extract = flag.BoolP("extract", "x", false, "extract a tar archive from the given directory") 38 verbose = flag.BoolP("verbose", "v", false, "print each filename") 39 file = flag.StringP("file", "f", "", "tar file") 40 list = flag.BoolP("list", "t", false, "list the contents of an archive") 41 ) 42 43 func main() { 44 flag.Parse() 45 46 if *create && *extract { 47 log.Fatal("cannot supply both -c and -x") 48 } else if *create && *list { 49 log.Fatal("cannot supply both -c and -t") 50 } else if *extract && *list { 51 log.Fatal("cannot supply both -x and -t") 52 } 53 54 if *file == "" { 55 log.Fatal("tar filename is required") 56 } 57 58 var filters []tarutil.Filter 59 if *verbose { 60 filters = []tarutil.Filter{tarutil.VerboseFilter} 61 } 62 63 switch { 64 case *create: 65 f, err := os.Create(*file) 66 if err != nil { 67 log.Fatal(err) 68 } 69 if err := tarutil.CreateTarFilter(f, flag.Args(), filters); err != nil { 70 f.Close() 71 log.Fatal(err) 72 } 73 if err := f.Close(); err != nil { 74 log.Fatal(err) 75 } 76 case *extract: 77 if flag.NArg() != 1 { 78 flag.Usage() 79 os.Exit(1) 80 } 81 f, err := os.Open(*file) 82 if err != nil { 83 log.Fatal(err) 84 } 85 defer f.Close() 86 if err := tarutil.ExtractDirFilter(f, flag.Arg(0), filters); err != nil { 87 log.Fatal(err) 88 } 89 case *list: 90 f, err := os.Open(*file) 91 if err != nil { 92 log.Fatal(err) 93 } 94 defer f.Close() 95 if err := tarutil.ListArchive(f); err != nil { 96 log.Fatal(err) 97 } 98 default: 99 log.Fatal("must supply at least one of: -c, -x, -t") 100 } 101 }