# README
aferocopy
aferocopy
copies directories recursively using spf13/afero
The idea and logic is ported from otiai10/copy
Prerequisites
Go >= 1.17
Install
go get go.nhat.io/aferocopy/v2
Usage
package main
import (
"fmt"
"go.nhat.io/aferocopy/v2"
)
func main() {
err := aferocopy.Copy("your/src", "your/dest", aferocopy.Options{
// Specify the source and destination fs of your choice, default is afero.OsFs.
// SrcFs: ...,
// DestFs: ...,
})
fmt.Println(err) // nil
}
Advanced Usage
// Options specifies optional actions on copying.
type Options struct {
// Source filesystem. Default is afero.NewOsFs().
SrcFs afero.Fs
// Source filesystem. Default is Options.SrcFs.
DestFs afero.Fs
// OnSymlink can specify what to do on symlink
OnSymlink func(src string) SymlinkAction
// OnDirExists can specify what to do when there is a directory already existing in destination.
OnDirExists func(src, dest string) DirExistsAction
// Skip can specify which files should be skipped
Skip func(src string) (bool, error)
// PermissionControl can control permission of
// every entry.
// When you want to add permission 0222, do like
//
// PermissionControl = AddPermission(0222)
//
// or if you even don't want to touch permission,
//
// PermissionControl = DoNothing
//
// By default, PermissionControl = PreservePermission
PermissionControl PermissionControlFunc
// Sync file after copy.
// Useful in case when file must be on the disk
// (in case crash happens, for example),
// at the expense of some performance penalty
Sync bool
// Preserve the atime and the mtime of the entries
// On linux we can preserve only up to 1 millisecond accuracy
PreserveTimes bool
// Preserve the uid and the gid of all entries.
PreserveOwner bool
// The byte size of the buffer to use for copying files.
// If zero, the internal default buffer of 32KB is used.
// See https://golang.org/pkg/io/#CopyBuffer for more information.
CopyBufferSize uint
}
package main
import (
"fmt"
"strings"
"go.nhat.io/aferocopy/v2"
)
func main() {
err := aferocopy.Copy("your/src", "your/dest", aferocopy.Options{
Skip: func(src string) (bool, error) {
return strings.HasSuffix(src, ".git"), nil
},
})
fmt.Println(err) // nil
}
Donation
If this project help you reduce time to develop, you can give me a cup of coffee :)
Paypal donation
or scan this

# Functions
Copy copies src to dest, doesn't matter if src is a directory or a file.
# Constants
Deep creates hard-copy of contents.
Merge preserves or overwrites existing files under the dir (default behavior).
Replace deletes all contents under the dir and copy src files.
Shallow creates new symlink to the dest of symlink.
Skip does nothing with symlink.
Untouchable does nothing for the dir, and leaves it as it is.
# Variables
AddPermission controls the permission of the destination file.
DoNothing do not touch the permission.
PreservePermission preserves the original permission.
# Type aliases
DirExistsAction represents what to do on dest dir.
PermissionControlFunc is a function that can be used to control the permission of a file or directory while copying.
SymlinkAction represents what to do on symlink.