nomi
nomi

Reputation: 1

How to automate calling of a file that is created daily with date stamp in file name

I used logrotate to create a log file that gets rolled over every day at 03:00; so the file that is created has the following format:

userlog.%Y-%m-%d

the script then zips the file as well so the end result is userlog.%Y-%m-%d.gz .... an actual file name is userlog.2015-09-09.gz.

I am writing a shell script that will copy the file created every day and will then unzip it, run a search on the log, extract results, format them, and then email them, and then delete the copied zip file.

I can get everything to work smoothly but I cannot copy the file using the method that it was created in.

I am trying to run the following:

sudo cp userlog.%Y-%d-%m.gz /home/local/temp

but the command does not execute. My understanding is that the current date, month, and year should be substituted into the variable fields in the file name.

If you could please correct my approach and understanding of this concept. Or please let me know if you feel this should work. Or if there is an alternate approach to call a file created in this fashion then kindly advise.

Presently I am having to write the filename into the script manually every morning and I would very much like to escape this hardship.

Upvotes: 0

Views: 144

Answers (1)

tripleee
tripleee

Reputation: 189387

You need a simple command substitution.

sudo cp userlog.$(date +%Y-%d-%m).gz /home/local/temp

%Y by itself is just a static string; but when passed as an argument to the date command, it specifies the four-digit year for the given date. (Default is today's date.)

Regardless of your problems with this particular command, you should certainly not need to edit the script file every day. A very fundamental feature of scripts is the parametrization of arguments. If your current script looks like

#!/bin/bash
gzgrep -c "failure" /path/to/userlog.2015-09-11.gz
sudo cp /path/to/userlog.2015-09-11.gz /home/local/temp

then it can easily be refactored to read the date as a command-line parameter:

#!/bin/bash
: ${1?"Syntax: $0 yyyy-mm-dd"}
gzgrep -c "failure" /path/to/userlog."$1".gz
sudo cp /path/to/userlog."$1".gz /home/local/temp 

If you saved this as userlog somewhere in your PATH, the solution to your original problem would now be simply

userlog $(date +%Y-%m-%d)

which of course could be saved as a script, too, or as a shell function in your personal .bash_profile or similar. But if this is mandatory daily routine, you'll probably prefer to add it as a cron job to run every morning (even if you are away). Cron will send you an email with any output. (Do notice that cron does not necessarily have the same PATH etc as your interactive login shell, though.)

Upvotes: 1

Related Questions