walk into directory and filter filename with regex

This commit is contained in:
rmanach 2022-04-12 12:47:41 +02:00
parent a7776f01f6
commit 304f720c79

55
main.go
View File

@ -1,10 +1,14 @@
// packer - a simple CLI tool to find and zip file corresponding to a given regex
// find + zip linux CLI works too
package main package main
import ( import (
"fmt"
"github.com/akamensky/argparse" "github.com/akamensky/argparse"
"log" "log"
"os" "os"
"fmt" fp "path/filepath"
re "regexp"
) )
// parseArguments - get needed arguments to launch the `packer` // parseArguments - get needed arguments to launch the `packer`
@ -25,17 +29,60 @@ func parseArguments() (string, string, string, error) {
err = fmt.Errorf("parsing error: %s", parseError) err = fmt.Errorf("parsing error: %s", parseError)
} }
return *regex, *outputPath, *directory, err return *regex, *directory, *outputPath, err
}
// buildRegex - build POSIX regex from a string
// WARN: lookahead and lookbehind are not supported
func buildRegex(regex string) (*re.Regexp, error) {
rc, err := re.CompilePOSIX(regex)
return rc, err
}
// walkFilteredDir - walk into a directory and its subdirectories and find files that match a regex
func walkDirFiltered(directory string, regex re.Regexp) ([]string, error) {
var files []string
err := fp.Walk(directory,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && regex.MatchString(path) {
fmt.Println(path)
files = append(files, path)
}
return err
})
return files, err
}
// getFilesFromDirectoryPath - wrapper calling `walkDirFiltered()`
func getFilesFromDirectoryPath(directory string, regex re.Regexp) ([]string, error) {
files, err := walkDirFiltered(directory, regex)
return files, err
} }
func main() { func main() {
// parse arguments
regex, directory, outputPath, err := parseArguments() regex, directory, outputPath, err := parseArguments()
if err != nil { if err != nil {
log.Fatal("error while parsing args : ", err) log.Fatal("error while parsing args : ", err)
} }
log.Printf("looking for file '%s' in '%s' ...", regex, directory) // build regex from string
rc, err := buildRegex(regex)
if err != nil {
log.Fatal("error while compiling regex : '", regex, "'\nWARN: lookahead and lookbehind not implemented")
}
// deferencing Regexp pointer
rd := *rc
// walk into directory
log.Printf("looking for file '%s' in '%s' ...", rd.String(), directory)
files, err := getFilesFromDirectoryPath(directory, rd)
log.Printf("files found : %d", len(files))
log.Printf("files zipped in %s", outputPath) log.Printf("files zipped in %s", outputPath)
} }