2 回答

TA貢獻1786條經驗 獲得超11個贊
首先,你應該使用filepath.WalkDir
Go 1.16 中引入的,它比filepath.Walk
.
Walk 的效率低于 Go 1.16 中引入的 WalkDir,后者避免在每個訪問的文件或目錄上調用 os.Lstat。
然后,無法將最大深度指定為直接參數。您必須計算WalkDirFunc
.
顯然,在文件路徑中計算分隔符是一種可接受的策略(并且可以說比其他可能的技巧更簡單),因此解決方案可能如下所示:
maxDepth := 2
rootDir := "root"
err := filepath.WalkDir(rootDir, func(path string, d fs.DirEntry, err error) error {
if err != nil {
// handle possible path err, just in case...
return err
}
if d.IsDir() && strings.Count(path, string(os.PathSeparator)) > maxDepth {
fmt.Println("skip", path)
return fs.SkipDir
}
// ... process entry
return nil
})
所以dir結構如下:
.
└── root
├── a.txt
├── b.txt
└── root1
├── a.txt
└── root2
├── a.txt
├── b.txt
├── root3
│ └── a.txt
└── root4
并假設root在 depth 0,上面的代碼打印上面的代碼:
skip root/root1/root2/root3
skip root/root1/root2/root4

TA貢獻1963條經驗 獲得超6個贊
func ControlDeepWalk(basepath string, count int, hard, debug bool) error {
var (
stock = make(map[string][]string)
countBase = 0
correctdirs []string
)
base := filepath.Base(basepath)
dirbase := filepath.Dir(basepath)
countBase = len(strings.Split(filepath.Dir(basepath), "/"))
if debug {
log.Printf("countbase: %v %v\n", strings.Split(filepath.Dir(basepath), "/"), countBase)
log.Printf("base :%v : %v : %v\n", base, dirbase, strings.Split(basepath, "/"))
}
err := filepath.WalkDir(basepath, func(path string, d fs.DirEntry, err error) error {
if err != nil {
if debug {
log.Printf("--error inf walkdir function, exit")
}
return err
}
if d.IsDir() {
if filepath.Dir(path) == filepath.Dir(basepath) {
if debug {
log.Printf("found root directory, skipping %v : %v\n", filepath.Dir(path), filepath.Dir(basepath))
}
} else {
compare := false
if hard {
compare = len(strings.Split(filepath.Dir(path), "/")) == countBase+count
} else {
compare = len(strings.Split(filepath.Dir(path), "/")) <= countBase+count
}
if compare {
if debug {
log.Printf("-found dir: [%v] %v\n", path, d.Name())
}
stock[filepath.Dir(filepath.Join(path, d.Name()))] = []string{}
correctdirs = append(correctdirs, filepath.Dir(filepath.Join(path, d.Name())))
}
}
} else {
fdir, ffile := filepath.Split(path)
for _, x := range correctdirs {
if x == filepath.Dir(fdir) {
if debug {
log.Printf("-found file:%v : %v %v %v \n", d.Name(), path, fdir, ffile)
}
stock[x] = append(stock[x], d.Name())
}
}
}
return nil
})
if debug {
for k, v := range stock {
log.Printf("%v : %v \n", k, v)
}
log.Printf("%v\n", stock)
}
return err
}
func main() {
p := "/backup/backuper/test"
count := 2
_ = ControlDeepWalk(p, count, false, true)
}
- 2 回答
- 0 關注
- 324 瀏覽
添加回答
舉報