Get change date of a folder in Go
I want to get the date when a folder was renamed, from terminal it can be done using the stat
command, e.g.:
> stat -x folders/folder1
File: "folders/folder1"
Size: 64 FileType: Directory
Mode: (0755/drwxr-xr-x) Uid: (2006390509/username) Gid:
(296108113/EMEADomain Users)
Device: 1,4 Inode: 2599274 Links: 2
Access: Mon Nov 12 17:59:57 2018
Modify: Mon Nov 12 14:12:20 2018
Change: Mon Nov 12 17:28:01 2018
The change date is the last date the folder's metadata was changed, which includes renaming.
Is there any way to get it with Go without using os.exec
and parsing the output? os.Stat
seems to provide only the last modification date which doesn't change when the folder is renamed.
go
add a comment |
I want to get the date when a folder was renamed, from terminal it can be done using the stat
command, e.g.:
> stat -x folders/folder1
File: "folders/folder1"
Size: 64 FileType: Directory
Mode: (0755/drwxr-xr-x) Uid: (2006390509/username) Gid:
(296108113/EMEADomain Users)
Device: 1,4 Inode: 2599274 Links: 2
Access: Mon Nov 12 17:59:57 2018
Modify: Mon Nov 12 14:12:20 2018
Change: Mon Nov 12 17:28:01 2018
The change date is the last date the folder's metadata was changed, which includes renaming.
Is there any way to get it with Go without using os.exec
and parsing the output? os.Stat
seems to provide only the last modification date which doesn't change when the folder is renamed.
go
"Is there any way to get it with Go without using os.exec and parsing the output?" I don't see any reason why not; you know the command to get the output and you know what format it's in. Are you having some trouble doing that? Can you show the code you're having trouble with?
– Adrian
Nov 12 '18 at 17:11
@Adrian it works, but I wonder if there is a better and cleaner way to get this information.
– lawful_evil
Nov 12 '18 at 17:13
add a comment |
I want to get the date when a folder was renamed, from terminal it can be done using the stat
command, e.g.:
> stat -x folders/folder1
File: "folders/folder1"
Size: 64 FileType: Directory
Mode: (0755/drwxr-xr-x) Uid: (2006390509/username) Gid:
(296108113/EMEADomain Users)
Device: 1,4 Inode: 2599274 Links: 2
Access: Mon Nov 12 17:59:57 2018
Modify: Mon Nov 12 14:12:20 2018
Change: Mon Nov 12 17:28:01 2018
The change date is the last date the folder's metadata was changed, which includes renaming.
Is there any way to get it with Go without using os.exec
and parsing the output? os.Stat
seems to provide only the last modification date which doesn't change when the folder is renamed.
go
I want to get the date when a folder was renamed, from terminal it can be done using the stat
command, e.g.:
> stat -x folders/folder1
File: "folders/folder1"
Size: 64 FileType: Directory
Mode: (0755/drwxr-xr-x) Uid: (2006390509/username) Gid:
(296108113/EMEADomain Users)
Device: 1,4 Inode: 2599274 Links: 2
Access: Mon Nov 12 17:59:57 2018
Modify: Mon Nov 12 14:12:20 2018
Change: Mon Nov 12 17:28:01 2018
The change date is the last date the folder's metadata was changed, which includes renaming.
Is there any way to get it with Go without using os.exec
and parsing the output? os.Stat
seems to provide only the last modification date which doesn't change when the folder is renamed.
go
go
asked Nov 12 '18 at 17:07
lawful_evil
394415
394415
"Is there any way to get it with Go without using os.exec and parsing the output?" I don't see any reason why not; you know the command to get the output and you know what format it's in. Are you having some trouble doing that? Can you show the code you're having trouble with?
– Adrian
Nov 12 '18 at 17:11
@Adrian it works, but I wonder if there is a better and cleaner way to get this information.
– lawful_evil
Nov 12 '18 at 17:13
add a comment |
"Is there any way to get it with Go without using os.exec and parsing the output?" I don't see any reason why not; you know the command to get the output and you know what format it's in. Are you having some trouble doing that? Can you show the code you're having trouble with?
– Adrian
Nov 12 '18 at 17:11
@Adrian it works, but I wonder if there is a better and cleaner way to get this information.
– lawful_evil
Nov 12 '18 at 17:13
"Is there any way to get it with Go without using os.exec and parsing the output?" I don't see any reason why not; you know the command to get the output and you know what format it's in. Are you having some trouble doing that? Can you show the code you're having trouble with?
– Adrian
Nov 12 '18 at 17:11
"Is there any way to get it with Go without using os.exec and parsing the output?" I don't see any reason why not; you know the command to get the output and you know what format it's in. Are you having some trouble doing that? Can you show the code you're having trouble with?
– Adrian
Nov 12 '18 at 17:11
@Adrian it works, but I wonder if there is a better and cleaner way to get this information.
– lawful_evil
Nov 12 '18 at 17:13
@Adrian it works, but I wonder if there is a better and cleaner way to get this information.
– lawful_evil
Nov 12 '18 at 17:13
add a comment |
2 Answers
2
active
oldest
votes
Change time is not accessible in os.FileInfo
but can be get via os.FileInfo.Sys()
which stores that data.
You can get it by
package main
import (
"fmt"
"log"
"os"
"syscall"
"time"
)
func main() {
f, err := os.Stat("your/dir")
if err != nil {
log.Fatalf("err reading: %v", err)
}
//access change time saved in os.FileInfo.Sys()
changeTime := f.Sys().(*syscall.Stat_t).Ctim
fmt.Print(time.Unix(changeTime.Unix()).String())
}
Ofcourse you need to check if f.Sys()
it's proper type, but yeah syscall.Stat_t.Ctim
is probably what you wanted.
I think, in macOS one has to replaceCtim
withCtimespec
– lawful_evil
Nov 13 '18 at 11:00
If that's true then inf.Sys()
it need to be other typ becausesyscall.Stat_t
don't haveCtimspec
. If Ctim is not accessible you need to call reflection onf.Sys()
to get it type.
– ttomalak
Nov 13 '18 at 13:21
In macsyscall.Stat_t
doesn't haveCtim
, but hasCtimspec
, it seems to be the same.
– lawful_evil
Nov 13 '18 at 14:43
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line76
syscall.Stat_t
fordarwin
os haveCtimespec
. It's wired why they do that beetwen os'es
– ttomalak
Nov 13 '18 at 15:52
add a comment |
If you're happy with calling os.Exec maybe you don't mind cross-platform issues. There was some discussion about this on a github issue a while back.
This code works for me to get the changed time anyway. Not sure how/if it'll work on Windows:
file, err := os.Open("test")
if err != nil {
panic(err)
}
stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())
fmt.Println(stat.ModTime())
fmt.Println(changedTime)
When I run
mv test test1 && mv test1 test && go run main.go
It gives me:
2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT
Which seems to correctly reflect the time I changed the dirname, and not the creation time (as in the first date)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53266940%2fget-change-date-of-a-folder-in-go%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Change time is not accessible in os.FileInfo
but can be get via os.FileInfo.Sys()
which stores that data.
You can get it by
package main
import (
"fmt"
"log"
"os"
"syscall"
"time"
)
func main() {
f, err := os.Stat("your/dir")
if err != nil {
log.Fatalf("err reading: %v", err)
}
//access change time saved in os.FileInfo.Sys()
changeTime := f.Sys().(*syscall.Stat_t).Ctim
fmt.Print(time.Unix(changeTime.Unix()).String())
}
Ofcourse you need to check if f.Sys()
it's proper type, but yeah syscall.Stat_t.Ctim
is probably what you wanted.
I think, in macOS one has to replaceCtim
withCtimespec
– lawful_evil
Nov 13 '18 at 11:00
If that's true then inf.Sys()
it need to be other typ becausesyscall.Stat_t
don't haveCtimspec
. If Ctim is not accessible you need to call reflection onf.Sys()
to get it type.
– ttomalak
Nov 13 '18 at 13:21
In macsyscall.Stat_t
doesn't haveCtim
, but hasCtimspec
, it seems to be the same.
– lawful_evil
Nov 13 '18 at 14:43
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line76
syscall.Stat_t
fordarwin
os haveCtimespec
. It's wired why they do that beetwen os'es
– ttomalak
Nov 13 '18 at 15:52
add a comment |
Change time is not accessible in os.FileInfo
but can be get via os.FileInfo.Sys()
which stores that data.
You can get it by
package main
import (
"fmt"
"log"
"os"
"syscall"
"time"
)
func main() {
f, err := os.Stat("your/dir")
if err != nil {
log.Fatalf("err reading: %v", err)
}
//access change time saved in os.FileInfo.Sys()
changeTime := f.Sys().(*syscall.Stat_t).Ctim
fmt.Print(time.Unix(changeTime.Unix()).String())
}
Ofcourse you need to check if f.Sys()
it's proper type, but yeah syscall.Stat_t.Ctim
is probably what you wanted.
I think, in macOS one has to replaceCtim
withCtimespec
– lawful_evil
Nov 13 '18 at 11:00
If that's true then inf.Sys()
it need to be other typ becausesyscall.Stat_t
don't haveCtimspec
. If Ctim is not accessible you need to call reflection onf.Sys()
to get it type.
– ttomalak
Nov 13 '18 at 13:21
In macsyscall.Stat_t
doesn't haveCtim
, but hasCtimspec
, it seems to be the same.
– lawful_evil
Nov 13 '18 at 14:43
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line76
syscall.Stat_t
fordarwin
os haveCtimespec
. It's wired why they do that beetwen os'es
– ttomalak
Nov 13 '18 at 15:52
add a comment |
Change time is not accessible in os.FileInfo
but can be get via os.FileInfo.Sys()
which stores that data.
You can get it by
package main
import (
"fmt"
"log"
"os"
"syscall"
"time"
)
func main() {
f, err := os.Stat("your/dir")
if err != nil {
log.Fatalf("err reading: %v", err)
}
//access change time saved in os.FileInfo.Sys()
changeTime := f.Sys().(*syscall.Stat_t).Ctim
fmt.Print(time.Unix(changeTime.Unix()).String())
}
Ofcourse you need to check if f.Sys()
it's proper type, but yeah syscall.Stat_t.Ctim
is probably what you wanted.
Change time is not accessible in os.FileInfo
but can be get via os.FileInfo.Sys()
which stores that data.
You can get it by
package main
import (
"fmt"
"log"
"os"
"syscall"
"time"
)
func main() {
f, err := os.Stat("your/dir")
if err != nil {
log.Fatalf("err reading: %v", err)
}
//access change time saved in os.FileInfo.Sys()
changeTime := f.Sys().(*syscall.Stat_t).Ctim
fmt.Print(time.Unix(changeTime.Unix()).String())
}
Ofcourse you need to check if f.Sys()
it's proper type, but yeah syscall.Stat_t.Ctim
is probably what you wanted.
answered Nov 12 '18 at 17:40
ttomalak
676110
676110
I think, in macOS one has to replaceCtim
withCtimespec
– lawful_evil
Nov 13 '18 at 11:00
If that's true then inf.Sys()
it need to be other typ becausesyscall.Stat_t
don't haveCtimspec
. If Ctim is not accessible you need to call reflection onf.Sys()
to get it type.
– ttomalak
Nov 13 '18 at 13:21
In macsyscall.Stat_t
doesn't haveCtim
, but hasCtimspec
, it seems to be the same.
– lawful_evil
Nov 13 '18 at 14:43
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line76
syscall.Stat_t
fordarwin
os haveCtimespec
. It's wired why they do that beetwen os'es
– ttomalak
Nov 13 '18 at 15:52
add a comment |
I think, in macOS one has to replaceCtim
withCtimespec
– lawful_evil
Nov 13 '18 at 11:00
If that's true then inf.Sys()
it need to be other typ becausesyscall.Stat_t
don't haveCtimspec
. If Ctim is not accessible you need to call reflection onf.Sys()
to get it type.
– ttomalak
Nov 13 '18 at 13:21
In macsyscall.Stat_t
doesn't haveCtim
, but hasCtimspec
, it seems to be the same.
– lawful_evil
Nov 13 '18 at 14:43
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line76
syscall.Stat_t
fordarwin
os haveCtimespec
. It's wired why they do that beetwen os'es
– ttomalak
Nov 13 '18 at 15:52
I think, in macOS one has to replace
Ctim
with Ctimespec
– lawful_evil
Nov 13 '18 at 11:00
I think, in macOS one has to replace
Ctim
with Ctimespec
– lawful_evil
Nov 13 '18 at 11:00
If that's true then in
f.Sys()
it need to be other typ because syscall.Stat_t
don't have Ctimspec
. If Ctim is not accessible you need to call reflection on f.Sys()
to get it type.– ttomalak
Nov 13 '18 at 13:21
If that's true then in
f.Sys()
it need to be other typ because syscall.Stat_t
don't have Ctimspec
. If Ctim is not accessible you need to call reflection on f.Sys()
to get it type.– ttomalak
Nov 13 '18 at 13:21
In mac
syscall.Stat_t
doesn't have Ctim
, but has Ctimspec
, it seems to be the same.– lawful_evil
Nov 13 '18 at 14:43
In mac
syscall.Stat_t
doesn't have Ctim
, but has Ctimspec
, it seems to be the same.– lawful_evil
Nov 13 '18 at 14:43
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line
76
syscall.Stat_t
for darwin
os have Ctimespec
. It's wired why they do that beetwen os'es– ttomalak
Nov 13 '18 at 15:52
Indeed golang.org/src/syscall/ztypes_darwin_amd64.go line
76
syscall.Stat_t
for darwin
os have Ctimespec
. It's wired why they do that beetwen os'es– ttomalak
Nov 13 '18 at 15:52
add a comment |
If you're happy with calling os.Exec maybe you don't mind cross-platform issues. There was some discussion about this on a github issue a while back.
This code works for me to get the changed time anyway. Not sure how/if it'll work on Windows:
file, err := os.Open("test")
if err != nil {
panic(err)
}
stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())
fmt.Println(stat.ModTime())
fmt.Println(changedTime)
When I run
mv test test1 && mv test1 test && go run main.go
It gives me:
2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT
Which seems to correctly reflect the time I changed the dirname, and not the creation time (as in the first date)
add a comment |
If you're happy with calling os.Exec maybe you don't mind cross-platform issues. There was some discussion about this on a github issue a while back.
This code works for me to get the changed time anyway. Not sure how/if it'll work on Windows:
file, err := os.Open("test")
if err != nil {
panic(err)
}
stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())
fmt.Println(stat.ModTime())
fmt.Println(changedTime)
When I run
mv test test1 && mv test1 test && go run main.go
It gives me:
2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT
Which seems to correctly reflect the time I changed the dirname, and not the creation time (as in the first date)
add a comment |
If you're happy with calling os.Exec maybe you don't mind cross-platform issues. There was some discussion about this on a github issue a while back.
This code works for me to get the changed time anyway. Not sure how/if it'll work on Windows:
file, err := os.Open("test")
if err != nil {
panic(err)
}
stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())
fmt.Println(stat.ModTime())
fmt.Println(changedTime)
When I run
mv test test1 && mv test1 test && go run main.go
It gives me:
2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT
Which seems to correctly reflect the time I changed the dirname, and not the creation time (as in the first date)
If you're happy with calling os.Exec maybe you don't mind cross-platform issues. There was some discussion about this on a github issue a while back.
This code works for me to get the changed time anyway. Not sure how/if it'll work on Windows:
file, err := os.Open("test")
if err != nil {
panic(err)
}
stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())
fmt.Println(stat.ModTime())
fmt.Println(changedTime)
When I run
mv test test1 && mv test1 test && go run main.go
It gives me:
2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT
Which seems to correctly reflect the time I changed the dirname, and not the creation time (as in the first date)
answered Nov 12 '18 at 18:01
mickadoo
2,0241429
2,0241429
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53266940%2fget-change-date-of-a-folder-in-go%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
"Is there any way to get it with Go without using os.exec and parsing the output?" I don't see any reason why not; you know the command to get the output and you know what format it's in. Are you having some trouble doing that? Can you show the code you're having trouble with?
– Adrian
Nov 12 '18 at 17:11
@Adrian it works, but I wonder if there is a better and cleaner way to get this information.
– lawful_evil
Nov 12 '18 at 17:13