Filename: Private: No Yes Filetype: Auto ABAP Sophia Apex Azure CLI Batch Bicep C Cameligo Clojure CoffeeScript C++ C# CSP CSS Cypher Dart Dockerfile ECL Elixir Flow9 FreeMarker2 FreeMarker2 (Angle/Bracket) FreeMarker2 (Angle/Dollar) FreeMarker2 (Auto/Bracket) FreeMarker2 (Auto/Dollar) FreeMarker2 (Bracket/Bracket) FreeMarker2 (Bracket/Dollar) F# Go GraphQL Handlebars Terraform HTML Ini Java JavaScript Julia Kotlin Less Lexon Liquid Lua Modula-3 Markdown MDX MIPS DAX MySQL Objective-C Pascal Pascaligo Perl PostgreSQL PHP Plain text ATS PQ PowerShell Protobuf Pug Python Q# R Razor Redis Redshift ReStructuredText Ruby Rust Small Basic Scala Scheme Sass Shell Solidity SPARQL SQL StructuredText Swift SV Tcl Twig TypeScript TypeSpec Visual Basic V WebGPU Shading Language XML YAML Indentation: Spaces Tabs 1 2 3 4 5 6 7 8 Clone package fsutil import ( "fmt" "io" "io/fs" "os" "path" "github.com/tzvetkoff-go/errors" ) // Extract ... func Extract(fsys fs.FS, rootPath string) error { return Walk(fsys, func(filePath string) error { destPath := path.Join(rootPath, filePath) err := os.MkdirAll(path.Dir(destPath), 0755) if err != nil { return err } file, err := fsys.Open(filePath[1:]) if err != nil { return err } defer file.Close() stat, err := file.Stat() if err != nil { return err } data, err := io.ReadAll(file) if err != nil { return err } err = os.WriteFile(destPath, data, stat.Mode()) if err != nil { return err } fmt.Println(filePath, "=>", destPath) return nil }) } // Walk ... func Walk(fsys fs.FS, callback func(string) error) error { return walkInternal(fsys, callback, "/") } func walkInternal(fsys fs.FS, callback func(string) error, currentPath string) error { fsysReadDir, ok := fsys.(fs.ReadDirFS) if !ok { return errors.New("%s: filesystem does not support readdir", currentPath) } entries, err := fsysReadDir.ReadDir(".") if err != nil { return err } for _, entry := range entries { if entry.IsDir() { sub, err := fs.Sub(fsys, entry.Name()) if err != nil { continue } err = walkInternal(sub, callback, path.Join(currentPath, entry.Name())) if err != nil { return err } } else { err = callback(path.Join(currentPath, entry.Name())) if err != nil { return err } } } return nil } Paste