Skip to content

Instantly share code, notes, and snippets.

@ynkdir
Last active August 29, 2015 14:23
Show Gist options
  • Save ynkdir/4b76c08c7f648a4145bf to your computer and use it in GitHub Desktop.
Save ynkdir/4b76c08c7f648a4145bf to your computer and use it in GitHub Desktop.
shallowcopy: copy directory tree with hard link (cp -rpl)
package main
import (
"flag"
"fmt"
"log"
"os"
"path/filepath"
"time"
)
func usage() {
fmt.Fprintf(os.Stderr, `shallowcopy: copy directory tree with hard link
Usage: shallowcopy <from> <to>
`)
}
// FIXME: owner mode time acl xattr etc...
func copyinfo(src string, dst string) error {
return nil
}
func copytime(src string, dst string) error {
fi, err := os.Stat(src)
if err != nil {
return err
}
atime := time.Now() // FIXME:
mtime := fi.ModTime()
err = os.Chtimes(dst, atime, mtime)
if err != nil {
return err
}
return nil
}
func main() {
flag.Usage = usage
flag.Parse()
if flag.NArg() != 2 {
flag.Usage()
os.Exit(2)
}
srcroot := flag.Arg(0)
dstroot := flag.Arg(1)
todo := []func() error{}
err := filepath.Walk(srcroot, func(src string, info os.FileInfo, err error) error {
if err != nil {
return err
}
rel, err := filepath.Rel(srcroot, src)
if err != nil {
return err
}
dst := filepath.Join(dstroot, rel)
if info.IsDir() {
err = os.Mkdir(dst, info.Mode())
if err != nil {
return err
}
err = copyinfo(src, dst)
if err != nil {
return err
}
// copy time later
todo = append(todo, func() error {
return copytime(src, dst)
})
} else {
err = os.Link(src, dst)
if err != nil {
return err
}
}
return nil
})
if err != nil {
log.Fatal(err)
}
for _, f := range todo {
err = f()
if err != nil {
log.Fatal(err)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment