How can I change the date modified/created of a file?
Is there a way to change the date when a file was modified/created (which is shown in Nautilus or with the ls -l command)? Ideally I am looking for a command which can change the date/time stamps of a whole bunch of files to a certain amount of time earlier or later (e.g. +8 hours or -4 days etc.).
6 Answers 6
As long as you are the owner of the file (or root), you can change the modification time of a file using the touch command:
By default this will set the file’s modification time to the current time, but there are a number of flags, such as the -d flag to pick a particular date. So for example, to set a file as being modified two hours before the present, you could use the following:
touch -d "2 hours ago" filename
If you want to modify the file relative to its existing modification time instead, the following should do the trick:
touch -d "$(date -R -r filename) - 2 hours" filename
If you want to modify a large number of files, you could use the following:
find DIRECTORY -print | while read filename; do # do whatever you want with the file touch -d "$(date -R -r "$filename") - 2 hours" "$filename" done
You can change the arguments to find to select only the files you are interested in. If you only want to update the file modification times relative to the present time, you can simplify this to:
find DIRECTORY -exec touch -d "2 hours ago" <> +
This form isn’t possible with the file time relative version because it uses the shell to form the arguments to touch .
As far as the creation time goes, most Linux file systems do not keep track of this value. There is a ctime associated with files, but it tracks when the file metadata was last changed. If the file never has its permissions changed, it might happen to hold the creation time, but this is a coincidence. Explicitly changing the file modification time counts as a metadata change, so will also have the side effect of updating the ctime .
To mention the simpler case when all files are in the same folder: touch -d «2 hours ago» /path/*.txt , for example.
The information about ctime as a metadata change time is from POSIX. I don’t know if the shell fragments in my answer would work with strict POSIX shell utilities. But they definitely work on Ubuntu, which is the context for answers on this site.
Easiest way — accessed and modified will be the same:
touch -a -m -t 201512180130.09 fileName.ext
-a = accessed -m = modified -t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format
If you wish to use NOW just drop the -t and the timestamp.
To verify they are all the same: stat fileName.ext
I tried to verify it using stat, but neither of the touch flags lead to a correct result. Modification date is adjusted, but changed and accessed date are actually changed to NOW
@ljoseph, take a look here: https://www.howtogeek.com/517098/linux-file-timestamps-explained-atime-mtime-and-ctime/#:~:text=%E2%80%9CModified%E2%80%9D%20means%20something%20inside%20the,will%20update%20the%20changed%20timestamp.
Using «-a» and «-m» together is probably unnecessary, «-a» is «change only the access time», and «-m» is «change only the modification time». If you want to update both, you don’t need to use any option.
Thanks for the help. This worked for me:
In the terminal go to the directory for date-edit. Then type:
find -print | while read filename; do # do whatever you want with the file touch -t 201203101513 "$filename" done
You wil see a «>» after you hit enter, exept for the last time -> «done».
Note: You may want to change «201203101513»
«201203101513» = is the date you want for all the files in this directory.
Webpage is no longer, albeit it is 6 years later. Nonetheless, this is the answer I was looking for. For those who want to include seconds in their time, use .ss where ss is the number of seconds. (Note: this does not seem to control sub-second timings such as nanoseconds or milliseconds, which for me just appeared as zeros; however, this difference was permissible for my use-case.)
Touch can reference a file’s date all by itself, no need to call date or use command substitution. Here’s a bit from touch’s info page:
`-r FILE' `--reference=FILE' Use the times of the reference FILE instead of the current time. If this option is combined with the `--date=TIME' (`-d TIME') option, the reference FILE's time is the origin for any relative TIMEs given, but is otherwise ignored. For example, `-r foo -d '-5 seconds'' specifies a time stamp equal to five seconds before the corresponding time stamp for `foo'. If FILE is a symbolic link, the reference timestamp is taken from the target of the symlink, unless `-h' was also in effect.
For example, to add 8 hours to a file’s date (filename of file quoted just in case of spaces, etc):
touch -r "file" -d '+8 hour' "file"
Using a loop over all files in the current dir:
for i in *; do touch -r "$i" -d '+8 hour' "$i"; done
I’ve heard that using a * and letting for pick the filenames itself is safer, but using find -print0 | xargs -0 touch . should handle most crazy characters like newlines, spaces, quotes, backslashes in a filename. (PS. try not to use crazy characters in filenames in the first place).
For example, to find all files in thatdir whose filenames start with an s , and add one day to those file’s modified timestamp, use:
find thatdir -name "s*" -print0 | xargs -0 -I '<>' touch -r '<>' -d '+1 day' '<>'
This little script at least works for me:
#!/bin/bash # find specific files files=$(find . -type f -name '*.JPG') # use newline as file separator (handle spaces in filenames) IFS=$'\n' for f in $ do # read file modification date using stat as seconds # adjust date backwards (1 month) using date and print in correct format # change file time using touch touch -t $(date -v -1m -r $(stat -f %m "$") +%Y%m%d%H%M.%S) "$" done
Adjusting the date of images based on meta info in the image would be pretty useful. ImageMagick’s identify can be used. e.g. ‘identify -verbose
It’s been a long time since I wrote any kind of Unix program, but I accidentally set the year incorrectly on a bunch of Christmas photos, and I knew if I didn’t change the date from 2015 to 2014 it would be a problem later on.
Maybe, this is an easy task, but I didn’t find any simple way to do it.
I modified a script I found here, which originally was used to modify the date by minus one month.
Here’s the original script:
#!/bin/bash # find specific files files=$(find . -type f -name '*.JPG') # use newline as file separator (handle spaces in filenames) IFS=$'\n' for f in $ do # read file modification date using stat as seconds # adjust date backwards (1 month) using date and print in correct format # change file time using touch touch -t $(date -v -1m -r $(stat -f %m "$") +%Y%m%d%H%M.%S) "$" done
Here’s my modified script that forced the date to the year «2014»:
#!/bin/bash # find specific files #files=$(find . -type f -name '*.JPG') # use newline as file separator (handle spaces in filenames) IFS=$'\n' for f in $* do # read file modification date using stat as seconds # adjust date backwards (1 month) using date and print in correct format # change file time using touch touch -t $(date -v +1y -r $(stat -f %m "$") +2014%m%d%H%M.%S) "$" done
I now realize I could have done a more generic version:
#!/bin/bash # find specific files #files=$(find . -type f -name '*.JPG') # use newline as file separator (handle spaces in filenames) IFS=$'\n' for f in $* do # read file modification date using stat as seconds # adjust date backwards (1 month) using date and print in correct format # change file time using touch (+1y adds a year "-1y" subtracts a year) # Below line subtracts a year touch -t $(date -v -1y -r $(stat -f %m "$") +%Y%m%d%H%M.%S) "$" # Below line adds a year # touch -t $(date -v +1y -r $(stat -f %m "$") +%Y%m%d%H%M.%S) "$" done
To use this file you would need to write it and
Is It Possible To Change the Date of Creation of a File (Docx, Pdf, jpg) from the Command Line?
Let’s say I would like to change the date of creation of a file (specially docx, pdf) to back in the past. Is it possible to do this from the terminal.
1 Answer 1
from man touch the format is as follows
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
guiverc@d960-ubu2:~$ touch file guiverc@d960-ubu2:~$ touch -t 7001012005 file guiverc@d960-ubu2:~$ stat file File: file Size: 0 Blocks: 16 IO Block: 4096 regular empty file Device: 37h/55d Inode: 574182 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ guiverc) Gid: ( 1000/ guiverc) Access: 1970-01-01 20:05:00.000000000 +1000 Modify: 1970-01-01 20:05:00.000000000 +1000 Change: 2019-06-04 22:46:02.178960273 +1000 Birth: -
Unfortunately this doesn’t change the creation date of the file. The creation time is not even shown in the stat -command: Birth: — . The touch command changed Access and Modify times. The creation date is a bit special, see unix.stackexchange.com/questions/91197/…
Yep. I see on a search «There is no way that creation time (btime) and change time(ctime) can be faked. The only trick i could suggest you is to put back your system data, touch the file then get back «in the future«. (unix.stackexchange.com/questions/336298/…)
Also «there is no creation time, there are only access, modify, and change dates. The POSIX standard only defines three distinct timestamps to be stored for each file: the time of last data access, the time of last data modification, and the time the file status last changed. Linux does not provide a kernel API for accessing the file creation times, even on filesystems supporting them (ext4, Btrfs and JFS), perhaps it will be impelemented in the future.» (from same reference)
How to change files creation time? (touch changes only modified time) [duplicate]
How to change files CREATION time? I tried to use ‘touch’ command but it changes only the last modified time — it does not change the first date — creation date. (After checking by ‘stat’ it still shows me the original file creation date) Is there any option to do this? thanks in advance
Are you sure you mean the creation (aka birth) time? Few systems make that information available. Maybe you’re thinking of the ctime (change time)
Creation time ( crtime or btime/birth time) is different than ctime (change time) so that I vote for a re-open of this question that may not be a duplicate, if taken literally. I guess this is part is confusing «it does not change the first date — creation date», but we cannot know for sure, and the OP writes «CREATION», so. (and a recent enough stat does show creation time, even though, maybe not first). And if it IS/WAS a duplicate, it should have been edited for clarity before setting duplicate status IMHO.
Voting to leave closed — at the time OP posted this, stat on Linux certainly wasn’t showing creation time. At the very least, this should be remain closed as unclear — OP needs to clarify which OS and filesystem this was before it should be reopened.
The OP didn’t mention linux. But the fact that OP never answered the comments hints that inode change time was mixed up with creation time.
3 Answers 3
There is no way that creation time (btime) and change time(ctime) can be faked.
The only trick i could suggest you is to put back your system data, touch the file then get back «in the future».
@StephenKitt, in any case neither the ctime (change time) nor btime (birth/creation time where available) can be faked other than by using file system debuggers or changing the system clock.
In linux, there is no creation time, there are only access, modify, and change dates. The POSIX standard only defines three distinct timestamps to be stored for each file: the time of last data access, the time of last data modification, and the time the file status last changed. Linux does not provide a kernel API for accessing the file creation times, even on filesystems supporting them (ext4, Btrfs and JFS), perhaps it will be impelemented in the future.
To modifie the accessed and modified time in a file, you can use the command touch with these options
You have to backup the file, delete it, then move the backup back in place, in order to modify the creation date in the inode.
Linked
Related
Hot Network Questions
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.14.43533
Linux is a registered trademark of Linus Torvalds. UNIX is a registered trademark of The Open Group.
This site is not affiliated with Linus Torvalds or The Open Group in any way.
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.