Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Mike Lewis on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

[b]Script Writing Help[/b] 1

Status
Not open for further replies.

sraj142

Technical User
Oct 25, 2006
49
0
0
IN
Hi All,
I need help to write a script based on the following requirement.

The script will scan the system time. It will move *.* from /home/test1 to /home/backup/. There will be files e.g. laser1, laser2, laser3 ... in the target folder. If the current system time is 7:30, the script will move all the files with "_a" as suffix with all the file names like laser1_a, laser2_a, laser3_a......
If the current system time is 8:30, the script will move all the files with "_b" as suffix with all the file names like laser1_b, laser2_b, laser3_b......
If the current system time is 9:30, the script will move all the files with "_c" as suffix with all the file names like laser1_c, laser2_c, laser3_c.....

There will be no "suffix like _a, _b & _c" in the target directory. But the script will rename all the files with proper suffix & then move them to destination.

Can anybody please help me to write the script ?

Regards - Sraj
 
Hi Khalid,
Here is a heartiest thanks for you. The way you helped me is really nice. As you said I have checked the script which encountered the following error ....

"Syntax error at line 3: `ftime=$' not expected."


Please have a look....


Regards- Sraj
 
I've just tested the first few lines and they are working!!

Could you please copy line by line from the above code!

Regards,
Khalid
 
Another Change in the script:

Code:
ls -al /home/test | grep ^- | while read i
do
ftime=$(echo $i | awk '{print $8}')
fname=$(echo $i | awk '{print $9}')
fhr=$(echo $ftime | cut -d':' -f1)
fmin=$(echo $ftime | cut -d':' -f2)
if [[ $fhr -lt 07 || $fhr -eq 07 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_a"
elif [[ $fhr -eq 07 && $fmin -gt 30 || $fhr -eq 08 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_b"
elif [[ $fhr -eq 08 && $fmin -gt 30 || $fhr -eq 09 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_c"
elif [[ $fhr -eq 09 && $fmin -gt 30 || $fhr -eq 11 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_d"
elif [[ $fhr -eq 11 && $fmin -gt 30 || $fhr -eq 10 || $fhr -eq 12 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_e"
elif [[ $fhr -eq 12 && $fmin -gt 30 || $fhr -lt 14 || $fhr -eq 14 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_f"
elif [[ $fhr -eq 14 || $fhr -eq 15 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_g"
elif [[ $fhr -eq 15 && $fmin -gt 30 || $fhr -eq 16 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_h"
elif [[ $fhr -eq 16 && $fmin -gt 30 || $fhr -eq 17 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_i"
elif [[ $fhr -eq 17 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_j"
elif [[ $fhr -eq 17 && $fmin -gt 30 || $fhr -eq 18 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_l"
elif [[ $fhr -eq 18 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_m"
elif [[ $fhr -eq 18 && $fmin -gt 30 || $fhr -eq 19 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_n"
elif [[ $fhr -eq 19 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_o"
elif [[ $fhr -eq 19 && $fmin -gt 30 || $fhr -eq 20 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_p"
elif [[ $fhr -eq 20 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_q"
elif [[ $fhr -eq 20 && $fmin -gt 30 || $fhr -eq 21 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_r"
fi
done

By the way, what are you going to do with files that are created between 21 and 00? are they excluded from the script?

Regards,
Khalid
 
Hi Khalid,
Thanks for the update. I will test it again 2moro & will let you know.
Actually from 21:00 hrs to 7:30 hrs all the files required to move with "_a" suffix.
thn 7:30hrs to 8:30hrs suffix will be "_b". And so on....upto 21:00hrs

Thanks in advance for your help...

Regards- Sraj
 
Then you better take this version (which will include 21 to 7:30 with 'a' suffix):

Code:
ls -al /home/test | grep ^- | while read i
do
ftime=$(echo $i | awk '{print $8}')
fname=$(echo $i | awk '{print $9}')
fhr=$(echo $ftime | cut -d':' -f1)
fmin=$(echo $ftime | cut -d':' -f2)
if [[ $fhr -lt 07 || $fhr -eq 07 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_a"
elif [[ $fhr -eq 07 && $fmin -gt 30 || $fhr -eq 08 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_b"
elif [[ $fhr -eq 08 && $fmin -gt 30 || $fhr -eq 09 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_c"
elif [[ $fhr -eq 09 && $fmin -gt 30 || $fhr -eq 11 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_d"
elif [[ $fhr -eq 11 && $fmin -gt 30 || $fhr -eq 10 || $fhr -eq 12 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_e"
elif [[ $fhr -eq 12 && $fmin -gt 30 || $fhr -lt 14 || $fhr -eq 14 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_f"
elif [[ $fhr -eq 14 || $fhr -eq 15 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_g"
elif [[ $fhr -eq 15 && $fmin -gt 30 || $fhr -eq 16 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_h"
elif [[ $fhr -eq 16 && $fmin -gt 30 || $fhr -eq 17 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_i"
elif [[ $fhr -eq 17 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_j"
elif [[ $fhr -eq 17 && $fmin -gt 30 || $fhr -eq 18 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_l"
elif [[ $fhr -eq 18 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_m"
elif [[ $fhr -eq 18 && $fmin -gt 30 || $fhr -eq 19 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_n"
elif [[ $fhr -eq 19 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_o"
elif [[ $fhr -eq 19 && $fmin -gt 30 || $fhr -eq 20 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_p"
elif [[ $fhr -eq 20 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fname"_q"
elif [[ $fhr -eq 20 && $fmin -gt 30 || $fhr -eq 21 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fname"_r"
elif [[ $fhr -eq 21 && $fmin -gt 00 || $fhr -gt 21 ]]
then
mv /home/test/$fname /home/backup/$fname"_a"
fi
done

Regards,
Khalid
 
Thanks Khalid,
I have tried the modified script, but unfortunately the same error encountered...
"rep.sc: Syntax error at line 3: `ftime=$' not expected."

My .login shell is ...

#!/bin/csh

pls let me know if you can find some solution...

Regards- Sraj

 
Gr8 Khalid,
This time the script running & also moving the files, but a small problem or modification is required i.e. the suffix is adding after the extension name. All the files in the source are .txt files & script renaming the files like "abcd.txt_a" instead of "abcd_a.txt, laser3_a.txt.....".

Can you please have a look...

Rgds- Sraj
 
How about now?

Code:
#!/bin/ksh

ls -al /home/test | grep ^- | while read i
do
ftime=$(echo $i | awk '{print $8}')
fname=$(echo $i | awk '{print $9}')
fhr=$(echo $ftime | cut -d':' -f1)
fmin=$(echo $ftime | cut -d':' -f2)
fnametxt=$(echo $fname | cut -d'.' -f1)

if [[ $fhr -lt 07 || $fhr -eq 07 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_a".txt
elif [[ $fhr -eq 07 && $fmin -gt 30 || $fhr -eq 08 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_b".txt
elif [[ $fhr -eq 08 && $fmin -gt 30 || $fhr -eq 09 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_c".txt
elif [[ $fhr -eq 09 && $fmin -gt 30 || $fhr -eq 11 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_d".txt
elif [[ $fhr -eq 11 && $fmin -gt 30 || $fhr -eq 10 || $fhr -eq 12 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_e".txt
elif [[ $fhr -eq 12 && $fmin -gt 30 || $fhr -lt 14 || $fhr -eq 14 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_f".txt
elif [[ $fhr -eq 14 || $fhr -eq 15 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_g".txt
elif [[ $fhr -eq 15 && $fmin -gt 30 || $fhr -eq 16 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_h".txt
elif [[ $fhr -eq 16 && $fmin -gt 30 || $fhr -eq 17 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_i".txt
elif [[ $fhr -eq 17 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_j".txt
elif [[ $fhr -eq 17 && $fmin -gt 30 || $fhr -eq 18 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_l".txt
elif [[ $fhr -eq 18 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_m".txt
elif [[ $fhr -eq 18 && $fmin -gt 30 || $fhr -eq 19 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_n".txt
elif [[ $fhr -eq 19 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_o".txt
elif [[ $fhr -eq 19 && $fmin -gt 30 || $fhr -eq 20 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_p".txt
elif [[ $fhr -eq 20 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_q".txt
elif [[ $fhr -eq 20 && $fmin -gt 30 || $fhr -eq 21 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_r".txt
elif [[ $fhr -eq 21 && $fmin -gt 00 || $fhr -gt 21 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_a".txt
fi
done

Again this change was not tested! I advice you to test it and let me know the result!

This script won't work if the file names contain dots '.' within the filename string! So let me know if you have such cases to cater for them!

Good Luck.

Regards,
Khalid
 
To make this script even more robust (to regard of even filenames with dots in between)!

Code:
#!/bin/ksh

ls -al /home/test | grep ^- | while read i
do
ftime=$(echo $i | awk '{print $8}')
fname=$(echo $i | awk '{print $9}')
fhr=$(echo $ftime | cut -d':' -f1)
fmin=$(echo $ftime | cut -d':' -f2)
fnametxt=${fname%.txt}

if [[ $fhr -lt 07 || $fhr -eq 07 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_a".txt
elif [[ $fhr -eq 07 && $fmin -gt 30 || $fhr -eq 08 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_b".txt
elif [[ $fhr -eq 08 && $fmin -gt 30 || $fhr -eq 09 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_c".txt
elif [[ $fhr -eq 09 && $fmin -gt 30 || $fhr -eq 11 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_d".txt
elif [[ $fhr -eq 11 && $fmin -gt 30 || $fhr -eq 10 || $fhr -eq 12 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_e".txt
elif [[ $fhr -eq 12 && $fmin -gt 30 || $fhr -lt 14 || $fhr -eq 14 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_f".txt
elif [[ $fhr -eq 14 || $fhr -eq 15 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_g".txt
elif [[ $fhr -eq 15 && $fmin -gt 30 || $fhr -eq 16 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_h".txt
elif [[ $fhr -eq 16 && $fmin -gt 30 || $fhr -eq 17 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_i".txt
elif [[ $fhr -eq 17 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_j".txt
elif [[ $fhr -eq 17 && $fmin -gt 30 || $fhr -eq 18 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_l".txt
elif [[ $fhr -eq 18 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_m".txt
elif [[ $fhr -eq 18 && $fmin -gt 30 || $fhr -eq 19 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_n".txt
elif [[ $fhr -eq 19 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_o".txt
elif [[ $fhr -eq 19 && $fmin -gt 30 || $fhr -eq 20 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_p".txt
elif [[ $fhr -eq 20 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_q".txt
elif [[ $fhr -eq 20 && $fmin -gt 30 || $fhr -eq 21 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_r".txt
elif [[ $fhr -eq 21 && $fmin -gt 00 || $fhr -gt 21 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_a".txt
fi
done

Regads,
Khalid
 
Hi Khalid,
I hope the following...

If the original filename is like "khalid.txt", the latest script may move it like "khalid.txt_a.txt". But I need something like "khalid_a.txt" or "khalid_b.txt".

Regards- Sraj

 
As you said, if the original filename is khalid.txt then the result would be khalid_a.txt

This line:

fnametxt=${fname%.txt}

will strip the ".txt" out of the file name, so if the filename was khalid.txt => fnametxt will contain only khalid

Then on moving the file the following line is used:

mv /home/test/$fname /home/backup/$fnametxt"_a".txt

which will take the fnametxt and add to it _a.txt! You know what i think this should be this way then:

Code:
#!/bin/ksh

ls -al /home/test | grep ^- | while read i
do
ftime=$(echo $i | awk '{print $8}')
fname=$(echo $i | awk '{print $9}')
fhr=$(echo $ftime | cut -d':' -f1)
fmin=$(echo $ftime | cut -d':' -f2)
fnametxt=${fname%.txt}

if [[ $fhr -lt 07 || $fhr -eq 07 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_a.txt"
elif [[ $fhr -eq 07 && $fmin -gt 30 || $fhr -eq 08 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_b.txt"
elif [[ $fhr -eq 08 && $fmin -gt 30 || $fhr -eq 09 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_c.txt"
elif [[ $fhr -eq 09 && $fmin -gt 30 || $fhr -eq 11 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_d.txt"
elif [[ $fhr -eq 11 && $fmin -gt 30 || $fhr -eq 10 || $fhr -eq 12 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_e.txt"
elif [[ $fhr -eq 12 && $fmin -gt 30 || $fhr -lt 14 || $fhr -eq 14 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_f.txt"
elif [[ $fhr -eq 14 || $fhr -eq 15 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_g.txt"
elif [[ $fhr -eq 15 && $fmin -gt 30 || $fhr -eq 16 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_h.txt"
elif [[ $fhr -eq 16 && $fmin -gt 30 || $fhr -eq 17 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_i.txt"
elif [[ $fhr -eq 17 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_j.txt"
elif [[ $fhr -eq 17 && $fmin -gt 30 || $fhr -eq 18 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_l.txt"
elif [[ $fhr -eq 18 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_m.txt"
elif [[ $fhr -eq 18 && $fmin -gt 30 || $fhr -eq 19 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_n.txt"
elif [[ $fhr -eq 19 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_o.txt"
elif [[ $fhr -eq 19 && $fmin -gt 30 || $fhr -eq 20 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_p.txt"
elif [[ $fhr -eq 20 && $fmin -le 30 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_q.txt"
elif [[ $fhr -eq 20 && $fmin -gt 30 || $fhr -eq 21 && $fmin -eq 00 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_r.txt"
elif [[ $fhr -eq 21 && $fmin -gt 00 || $fhr -gt 21 ]]
then
mv /home/test/$fname /home/backup/$fnametxt"_a.txt"
fi
done

This will definitely work :)

Regards,
Khalid
 
Hi Khalid,
Now everything if fine. Thanks a lot bro.. for the help. Cen you please advise me the following ...

fhr=$(echo $ftime | cut -d':' -f1)
fmin=$(echo $ftime | cut -d':' -f2)

Above will store the file created hr & min to fhr & fmin. What should be the syntex to store System hr in 'fhr' & System min in 'fmin' ? I will be glad if you may help me out...

Regards - Sraj
 
Glade to help Sraj :)

You can do this using the following:

Code:
sys_hr=$(date +"%HH")
sys_min=$(date +"%MM")

echo "System hour is "$sys_hr
echo "System min is "$sys_min

You can get the month, number of day in the month, and year using the following:

Code:
mm Specifies the month number. 
dd Specifies the number of the day in the month. 
HH Specifies the hour in the day (using a 24-hour clock). 
MM Specifies the minute number. 
YY Specifies the first two digits of the year.

Use this link for more information:


Regards,
Khalid
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top