Last active
August 29, 2015 14:23
-
-
Save ynkdir/4b76c08c7f648a4145bf to your computer and use it in GitHub Desktop.
shallowcopy: copy directory tree with hard link (cp -rpl)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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