Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash convert a number of epoch values to datetime

I have a number of files in the form foo_[SECONDS.MILLISECONDS]_bar.tar.gz and for each file I would like to be to get a datetime value (YYYYMMDDHHMMSS) for each file.

So far I have

ls -1 /filestore/*.tar.gz | cut -d _ -f 2  | date -f -

But this errors along the lines of

date: invalid date '1467535262.712041352'

How should a bash pipeline of epoch values be converted into a datetime string?

MWE

mkdir tmpBLAH
touch tmpBLAH/foo_1467483118.640314986_bar.tar.gz
touch tmpBLAH/foo_1467535262.712041352_bar.tar.gz
ls -1 tmpBLAH/*.tar.gz | cut -d _ -f 2 | date -f -
like image 662
Steph Locke Avatar asked Oct 26 '25 01:10

Steph Locke


2 Answers

To convert epoch time to datetimem, please try the following command:

    date -d  @1346338800 +'%Y%m%d%H%M%S'

1346338800 is a epoch time.

About your case, for comand line as following:

echo 1467535262.712041352 | cut -d '.' -f 1 | xargs -I{} date -d @{} +'%Y%m%d%H%M%S'

you will get:

20160703174102
like image 166
gzh Avatar answered Oct 27 '25 16:10

gzh


Something like this?

for f in /filestore/*.tar.gz; do
    epoch=${f#*_}
    date -d @${epoch%%.*} +%Y%m%d%H%M%S
done

The syntax of the date command differs between platforms; I have assumed GNU date, as commonly found on Linux. (You could probably use date -f if you add the @ before each timestamp, but I am not in a place where I can test this right now.) Running a loop makes some things easier, such as printing both the input file name and the converted date, while otherwise a pipeline would be the most efficient and idiomatic solution.

As an aside, basically never use ls in scripts.

like image 41
tripleee Avatar answered Oct 27 '25 15:10

tripleee



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!