Skip to content

nhatthm/aferocopy

Repository files navigation

aferocopy

GitHub Releases Build Status codecov Go Report Card GoDevDoc Donate

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

paypal

       or scan this