Reputation: 2595
I can't seem to find how to print out the date of a file. I'm so far able to print out all the files in a directory, but I need to print out the dates with it.
I know I need to attach a date format with the echo of the entry, but all I can't find the correct format.
echo "Please type in the directory you want all the files to be listed"
read directory
for entry in "$directory"/*
do
echo "$entry"
done
Upvotes: 224
Views: 285816
Reputation: 31
To get the modification date of a file in the format YYYYMMDD_hhmm:
date -r <file> "+%Y%m%d_%H%M"
20240119_1018
MODDATE=`date -r <file> "+%Y%m%d_%H%M"`
echo $MODDATE
20240119_1018
This can also be done in a brute force way with
stat -c %y <file>
2024-01-19 10:18:17.000000000 -0500
stat -c %y <file> | sed "s/^\(....\)-\(..\)-\(..\) \(..\):\(..\).*$/\1\2\3_\4\5/"
20240119_1018
MODATE=`stat -c %y <file> | sed "s/^\(....\)-\(..\)-\(..\) \(..\):\(..\).*$/\1\2\3_\4\5/"`
echo $MODATE
20240119_1018
Upvotes: 0
Reputation: 1
You can use:
ls -lrt filename |awk '{printf "%02d",$7}'
This will display the date (a current day of a month) in 2 digits.
If between 1 to 9 it adds "0" prefix to it and converts to 01 - 09.
Hope this meets the expectation.
Upvotes: -2
Reputation: 749
Alternatively, you may try also :
date -r filename +"%Y-%m-%d %H:%M:%S"
Upvotes: 34
Reputation: 99
For the line breaks i edited your code to get something with no line breaks.
#!/bin/bash
for i in /Users/anthonykiggundu/Sites/rku-it/*; do
t=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")
echo $t : "${i##*/}" # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path
done
Upvotes: 4
Reputation: 3853
Isn't the 'date' command much simpler? No need for awk, stat, etc.
date -r <filename>
Also, consider looking at the man page for date formatting; for example with common date and time format:
date -r <filename> "+%m-%d-%Y %H:%M:%S"
Upvotes: 368
Reputation: 5621
I wanted to get a file's modification date in YYYYMMDDHHMMSS
format. Here is how I did it:
date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S
Explanation. It's the combination of these commands:
stat -c %Y myfile.css # Get the modification date as a timestamp
date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp)
Upvotes: 2
Reputation: 1506
On OS X, I like my date to be in the format of YYYY-MM-DD HH:MM
in the output for the file.
So to specify a file I would use:
stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename]
If I want to run it on a range of files, I can do something like this:
#!/usr/bin/env bash
for i in /var/log/*.out; do
stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
done
This example will print out the last time I ran the sudo periodic daily weekly monthly
command as it references the log files.
To add the filenames under each date, I would run the following instead:
#!/usr/bin/env bash
for i in /var/log/*.out; do
stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
echo "$i"
done
The output would was the following:
2016-40-01 16:40
/var/log/daily.out
2016-40-01 16:40
/var/log/monthly.out
2016-40-01 16:40
/var/log/weekly.out
Unfortunately I'm not sure how to prevent the line break and keep the file name appended to the end of the date without adding more lines to the script.
PS - I use #!/usr/bin/env bash
as I'm a Python user by day, and have different versions of bash
installed on my system instead of #!/bin/bash
Upvotes: 16
Reputation: 1
You can use the
stat
command
stat -c %y "$entry"
More info
%y time of last modification, human-readable
Upvotes: 174
Reputation: 2595
EDITED: turns out that I had forgotten the quotes needed for $entry
in order to print correctly and not give the "no such file or directory" error. Thank you all so much for helping me!
Here is my final code:
echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates
read directory
for entry in "$directory"/*
do
modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file"
modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty
echo $entry:$modDate
Prints out like this:
/home/joanne/Dropbox/cheat sheet.docx:2012-03-14
/home/joanne/Dropbox/Comp:2013-05-05
/home/joanne/Dropbox/Comp 150 java.zip:2013-02-11
/home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11
/home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11
/home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12
/home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11
/home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05
/home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11
Upvotes: 2
Reputation: 5764
If file name has no spaces:
ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }'
This prints as the following format:
Dec 21 20:03 a1.out
Dec 21 20:04 a.cpp
If file names have space (you can use the following command for file names with no spaces too, just it looks complicated/ugly than the former):
ls -l <dir> | awk '{printf ("%s %s %s ", $6, $7, $8); for (i=9; i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'
Upvotes: 5
Reputation: 20106
Adding to @StevePenny answer, you might want to cut the not-so-human-readable part:
stat -c%y Localizable.strings | cut -d'.' -f1
Upvotes: 7