Skip to content

Instantly share code, notes, and snippets.

@ma6174
Created March 9, 2015 19:22
Show Gist options
  • Select an option

  • Save ma6174/16d502fb34fced99d63c to your computer and use it in GitHub Desktop.

Select an option

Save ma6174/16d502fb34fced99d63c to your computer and use it in GitHub Desktop.
walk
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"sort"
"strings"
)
func handleErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func readDirNames(dirname string) []string {
f, err := os.Open(dirname)
handleErr(err)
names, err := f.Readdirnames(-1)
f.Close()
handleErr(err)
sort.Strings(names)
return names
}
func isDir(dir string) bool {
fi, err := os.Stat(dir)
handleErr(err)
return fi.IsDir()
}
func min(a, b int) int {
if a > b {
return b
}
return a
}
func pathcmp(a, b string) int {
spa := strings.Split(a, "/")
spb := strings.Split(b, "/")
for i := 0; i < min(len(spa), len(spb)); i++ {
if spa[i] > spb[i] {
return 1
} else if spa[i] < spb[i] {
return -1
}
}
if len(spa) < len(spb) {
return -1
} else if len(spa) > len(spb) {
return 1
}
return 0
}
func next(baseDir, current string) string {
dir := current
if !isDir(current) {
dir = filepath.Dir(current)
}
for _, name := range readDirNames(dir) {
ne := filepath.Join(dir, name)
if pathcmp(ne, current) > 0 {
return ne
}
}
parent := current
for {
parent = filepath.Dir(parent)
for _, name := range readDirNames(parent) {
ne := filepath.Join(parent, name)
if !strings.HasPrefix(ne, baseDir) {
return ""
}
if pathcmp(ne, current) > 0 {
return ne
}
}
}
return ""
}
func walk(baseDir, from string) {
var err error
baseDir, err = filepath.Abs(baseDir)
handleErr(err)
from, err = filepath.Abs(from)
handleErr(err)
for {
from = next(baseDir, from)
if from == "" {
break
}
if !isDir(from) {
fmt.Println(from)
}
}
}
func main() {
walk(os.Args[1], os.Args[2])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment