github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/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 // 9 // tar [OPTION...] [FILE]... 10 // 11 // Description: 12 // 13 // This command line can be used only in the following ways: 14 // tar -cvf x.tar directory/ # create 15 // tar -cvf x.tar file1 file2 ... # create 16 // tar -tvf x.tar # list 17 // tar -xvf x.tar directory/ # extract 18 // 19 // Options: 20 // 21 // -c: create a new tar archive from the given directory 22 // -x: extract a tar archive to the given directory 23 // -v: verbose, print each filename (optional) 24 // -f: tar filename (required) 25 // -t: list the contents of an archive 26 // 27 // TODO: The arguments deviates slightly from gnu tar. 28 package main 29 30 import ( 31 "log" 32 "os" 33 34 flag "github.com/spf13/pflag" 35 "github.com/mvdan/u-root-coreutils/pkg/tarutil" 36 ) 37 38 var ( 39 create = flag.BoolP("create", "c", false, "create a new tar archive from the given directory") 40 extract = flag.BoolP("extract", "x", false, "extract a tar archive from the given directory") 41 file = flag.StringP("file", "f", "", "tar file") 42 list = flag.BoolP("list", "t", false, "list the contents of an archive") 43 noRecursion = flag.Bool("no-recursion", false, "do not automatically recurse into directories") 44 verbose = flag.BoolP("verbose", "v", false, "print each filename") 45 ) 46 47 func main() { 48 flag.Parse() 49 50 if *create && *extract { 51 log.Fatal("cannot supply both -c and -x") 52 } else if *create && *list { 53 log.Fatal("cannot supply both -c and -t") 54 } else if *extract && *list { 55 log.Fatal("cannot supply both -x and -t") 56 } 57 58 if *file == "" { 59 log.Fatal("tar filename is required") 60 } 61 62 opts := &tarutil.Opts{ 63 NoRecursion: *noRecursion, 64 } 65 if *verbose { 66 opts.Filters = []tarutil.Filter{tarutil.VerboseFilter} 67 } 68 69 switch { 70 case *create: 71 f, err := os.Create(*file) 72 if err != nil { 73 log.Fatal(err) 74 } 75 if err := tarutil.CreateTar(f, flag.Args(), opts); err != nil { 76 f.Close() 77 log.Fatal(err) 78 } 79 if err := f.Close(); err != nil { 80 log.Fatal(err) 81 } 82 case *extract: 83 if flag.NArg() != 1 { 84 flag.Usage() 85 os.Exit(1) 86 } 87 f, err := os.Open(*file) 88 if err != nil { 89 log.Fatal(err) 90 } 91 defer f.Close() 92 if err := tarutil.ExtractDir(f, flag.Arg(0), opts); err != nil { 93 log.Fatal(err) 94 } 95 case *list: 96 f, err := os.Open(*file) 97 if err != nil { 98 log.Fatal(err) 99 } 100 defer f.Close() 101 if err := tarutil.ListArchive(f); err != nil { 102 log.Fatal(err) 103 } 104 default: 105 log.Fatal("must supply at least one of: -c, -x, -t") 106 } 107 }