I don't know if the method I am using is complex, but the aim of this script is to generate reports every 1st, 7th and 15th of every month. However, the reports won't be generated until a few days after these dates. Like the reports for the 1st will be generated on the 5th of the month for example. And reports for the 7th will be generated on the 9th or 10th. And reports for the 15th will be generated on the 17th. These days of course will have to fall on a weekday, and not a weekend, which is why we cannot put a fixed date, for each batch.
For the reports on the 1st, I have to copy files dated 2nd onwards from the main directory that it was generated in, into another directory.
This is why I am cracking my head on how to get this done.
For example, these are the files listed in the main directory :
I have to copy these files, as you can see, dated May 2nd onwards till the latest (in this case, the 5th) to another directory. How do I create a bash script to do this? These are however not the only files here. There are older files from previous months also here. I need to copy over only the latest months' files dated 2nd onwards to another directory. The script has to be intelligent enough to recognize the files needed for that particular batch (1st, 7th, or 15th), and copy it over to another directory.
Then once it has been copied over to the other directory, this command has to be executed :
Means the oldest mainlog file will be labelled with the higher number. In the example above, the date of the oldest file was 16th (this was for batch 15). The report was generated on the 17th. Therefore the name of the oldest mainlog file will be "mainlog.2". Then there were 2 mainlog files generated on the 17th, which was mainlog.1 and mainlog.
This is the script that I have created so far. Any corrections and additional advise will definitely be very appreciated :
---------- Post updated at 06:32 PM ---------- Previous update was at 06:18 PM ----------
For TESTING purposes ONLY, however, I tried running some commands from the terminal to copy files from the directory /home/emokheng to /home/emoaigin :
These are the files in /home/emokheng :
As you can see the dates of the files are August 18th. For report generation this will be considered batch 15. These are the steps I have performed :
What is wrong in these steps? Why does it not recognize files dated 18th and copy it over?
You can't use it like that: for (( "$D"=16; "$D"<=20; "$D"++ ));. Use unexpanded variable names like for (( i=1; i<5; i++ )); do echo $i; done. $D is already expanded by the shell.
But I want to copy files with a certain date over from one dir to another.
How do i do this?
I tried using the for loop like this :
As you can see, it does the loop for times, (i.e copying 2 files 4 times).
This is not I want. What I want is for the script to recognize the files dated from the 16th to the latest date, and copy it over to the other directory, without repeating or overwriting like above.
Again, the $D is an argument and need to be in quotes.
lets the shell do variable substitution then word splitting then globbing (replace wildcards with matching filenames). The word splitting reformats the line breaks to spaces.
lets the shell do variable substitution only.
So far you did fairly well. A few comments to your code:
First, you should not use backticks for command substitution any more. If you are not using an original Bourne shell (which would only know the backticks and nothing else) you should use the POSIX-construct you had at the beginning of the thread:
Second, you need only one quote for a whole string. i.e. replace this:
with this:
Third, you need no ";" at the end of a line. You only need them if you have more than one command on the same line:
but:
and a last point: when you use integer environments you should have spaces surrounding them. It is not only easier to read but some shells are quite picky about this:
Finally, a suggestion: when you write scripts you should try to avoid relative pathes. If you use "." or ".." in a script it tends to work if called in one directory but fail if called in another. Better to avoid this sort of risk and only use absolute pathes.
So, here is like i would write it:
Quote:
However, I have another part of the script that has this line :
I did not put the "" for the $MONTH$YEAR, but it still produced the output I wanted. Why is this?
A string is a string. Hence, this:
and this:
produces the same. It would not produce the same only if in the part not covered by quotes would contain something the shell interprets: blanks, tabs, newlines, and so on. Therefore you can (and in fact should, as i said above) cover always your whole string into a single pair of double quotes:
getting error as below while executing script in linux.
OS version:
Linux VGP-3GPSDB-LX 3.10.0-514.el7.x86_64 #1 SMP Wed Oct 19 11:24:13 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
./imxtract.sh: line 395: unexpected EOF while looking for matching ``'
./imxtract.sh: line 402: syntax error:... (1 Reply)
I have the following script test.sh owned by dwdev account and group dwdev, the permissions on the script are as follows.
-rw-r-x--- 1 dwdev dwdev 279 Sep 17 13:19 test.sh
Groups:
cat /etc/group | grep dwdev
dwdev:x:704:dwdev
dwgroup:x:725:dwdev
writers:x:726:dwdev
User:
cat /etc/passwd |... (3 Replies)
hi all,
i am getting libssh2 error while executing script in RHEL 6, when i locate that file its not there below is the ouput of this
# locate libssh2_agent_init
# cat /etc/issue
Red Hat Enterprise Linux Server release 6.1 (Santiago)
Kernel \r on an \m
how do i resolve this issue, i... (1 Reply)
Hi,
I am not able to figure out what the problem is:
getting the following error
sqltst.sh: 1: not found
here is the script
#!/bin/sh
. /home/dev1/.profile
. /home/dev1/.infenv
`sqlplus -s $REPDB_LOGON << EOF
SET SERVEROUT ON
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL... (4 Replies)
Hi
Please assist. Im getting an error while execuing the script name d "cdsnd.basel.cd_new
" as siiadm user. Thanks.
siiadm> ls -l
total 64
-rwxr-xr-x 1 siiadm sboadm 1004 Sep 17 2008 cdsnd.basel.cd
-rwxr-xr-x 1 siiadm sapsys 998 Nov 16 09:14 cdsnd.basel.cd_new... (1 Reply)
Hi ,
I m getting an error after executing the script.
My script.
Script is used to find out the date on 8 different machines(mentioned in SERVERNAMES file).
I have added public key to avoid ssh password and ssh without password working fine.
#!/bin/sh
fn_VMFind()
{
Date=`ssh -t... (5 Replies)
I am executing the below in telnet
#!/usr/bin/ksh
File1=simple.txt # The file to check
LogFile=simple.log # The log file
DelayMax=30 # Timeout delay
Tolerance=2
# BEGIN ##############################
while true
do
StampNow=$(date +%s)/60 # stamp in minutes
... (3 Replies)
Hello
I am executing the following script
nawk 'NR == 1 || substr($0,63,5) ~ /H... / && \
_++ == 2 { fn && close(fn); fn = "part_" ++c; _ = 1 }
{ print > fn }' sample.dat
When i execute as it is it is executing fine. but when i execute the whole script as a single line like below
... (2 Replies)