Allow to update organized file's mtime corresponding to the original file's creation date

This commit is contained in:
2019-09-10 14:14:42 +03:00
parent ddce47312e
commit 9f86a08c82
3 changed files with 19 additions and 8 deletions

View File

@@ -55,7 +55,7 @@ photocalog -target ./photos/ ./sync/photos/*
### Monitor ### Monitor
#### Copy files (make a COW if fs supports it) #### Copy files (make a COW if fs supports it)
```bash ```bash
photocalog -mode copy -target ./photos/ ./sync/photos/* photocalog -mode copy -target ./photos -monitor ./sync/photos/*
``` ```
#### Create hardlinks (only withing one disk partition) #### Create hardlinks (only withing one disk partition)

View File

@@ -19,6 +19,7 @@ func main() {
mode := flag.String("mode", "hardlink", "Manage mode: copy or hardlink") mode := flag.String("mode", "hardlink", "Manage mode: copy or hardlink")
target := flag.String("target", "./", "Root directory to organize files in") target := flag.String("target", "./", "Root directory to organize files in")
monitor := flag.String("monitor", "", "Monitor specified folder for new files") monitor := flag.String("monitor", "", "Monitor specified folder for new files")
updateMtime := flag.Bool("update_mtime", false, "Update mtime on organized files to be equal to the files creation date")
flag.Parse() flag.Parse()
args := flag.Args() args := flag.Args()
@@ -34,7 +35,7 @@ func main() {
log.Fatalf("Invalid mode %s", *mode) log.Fatalf("Invalid mode %s", *mode)
} }
mgr, err := manager.NewManager(*target, manageMode) mgr, err := manager.NewManager(*target, manageMode, *updateMtime)
if err != nil { if err != nil {
log.Fatalf(err.Error()) log.Fatalf(err.Error())
} }

View File

@@ -7,6 +7,7 @@ import (
"os/exec" "os/exec"
"path" "path"
"strings" "strings"
"time"
"github.com/pkg/errors" "github.com/pkg/errors"
@@ -14,18 +15,20 @@ import (
) )
type Manager struct { type Manager struct {
TargetPath string TargetPath string
Mode ManageMode Mode ManageMode
updateMtime bool
processor func(fp, targetDir string) (string, error) processor func(fp, targetDir string) (string, error)
extractorsCache map[string]metadata.Extractor extractorsCache map[string]metadata.Extractor
} }
func NewManager(target string, mode ManageMode) (*Manager, error) { func NewManager(target string, mode ManageMode, updateMtime bool) (*Manager, error) {
manager := Manager{ manager := Manager{
TargetPath: target, TargetPath: target,
Mode: mode, Mode: mode,
processor: nil, processor: nil,
updateMtime: updateMtime,
} }
if err := manager.initProcessor(); err != nil { if err := manager.initProcessor(); err != nil {
return nil, err return nil, err
@@ -123,6 +126,13 @@ func (m *Manager) Manage(fp string) error {
return errors.WithMessagef(err, "failed to process %s to %s", fp, targetDir) return errors.WithMessagef(err, "failed to process %s to %s", fp, targetDir)
} }
if m.updateMtime {
err = os.Chtimes(target, time.Now(), md.Time)
if err != nil {
return errors.WithMessage(err, "failed to update mtime/atime")
}
}
if m.Mode == Hardlink { if m.Mode == Hardlink {
log.Println(fp, "linked to", target) log.Println(fp, "linked to", target)
} else if m.Mode == Copy { } else if m.Mode == Copy {