Find, Append, Move & Rename Multiple Files

Using a bash script, I need to find all files in a folder "except" the newest file. Then I need to insert the contents of one text file into all the files found. This text needs to be placed at the beginning of each file and needs a blank line between it and the current contents of the file. Then I need to move all those modified files to another folder and change the extension portion of their name from .log to .101

My bash skills are absolutely nil. I have used find and can find all the files I want and I have managed to use paste to paste into "1" file but cannot figure out how to do this entire routine for all the found files.

They switched over to linux here and the windows app that creates these files is now running on wine. For some reason the dos batch file I used to do this routine fails to work on wine.

if you are ok, post your batch code. There's equivalent unix commands you can use and people here may guide you on which ones to use.. then you can start to learn shell...

cudnt understand ur queries...
just paste ur code to get an idea what u are trying to do...

Here's the dos batch code. I note that in my original post that I failed to mention that the original files I am working with also get moved off to an archive, unmodified. There's never a filename conflict because each original file has a date name ( s082607.log, etc ). I've explained each step in the process. I have no doubt this dos batch could be more efficient but I am no dos batch pro. The script did work correctly for over 3 years in both NT4 and Win2K. It just doesn't run under wine NT4 or Win2k emulation even though the drive and directory layouts remain the same. Perhaps the wine cmd interpreter doesn't like the code or something.

:::: Find all logs except most recent ::::
for /f "skip=1 delims=" %%a in ('dir /a-d /b /o-d "d:\buzzard\logs\s-series\*.log" ')

:::: Append a text header message to each found file and copy to a temp dir :::::
do copy d:\buzzard\scripts\addon.txt+d:\buzzard\logs\s-series\"%%a" d:\buzzard\temp\sendlogs\s-series\"%%a"

::::: Rename modified files :::::
ren d:\buzzard\temp\sendlogs\s-series\*.log *.101

::::: Move the modified files to a mail queue for future delivery ::::
move d:\buzzard\temp\sendlogs\s-series\*.101 e:\promail\queue\

::::: Move originals - except most recent - off to an archive :::::
for /f "skip=1 delims=" %%b in ('dir /a-d /b /o-d "d:\buzzard\logs\s-series\*.log" ') do move d:\buzzard\logs\s-series\"%%b" "f:\buzzard\logs\s-series\

Well, I have made a bit of headway in converting this MS-DOS batch over to bash. This seems to work from a terminal. Have yet to try it in a script. I have no doubt there's a much easier, much shorter, and more correct way to do all this but it's what I've figured out so far. There's also one problem that arises concerning the pasting to append a glue header to the logs.

::: Find all files except the current file and move to a temp dir :::
cd /home/trapper/.wine/drive_d/buzzard/logs/s-series
find . -daystart -mtime +0 -exec mv {} /home/trapper/.wine/drive_d/buzzard/temp \;
::: Paste glue header and each log file to new files in the queue :::
for i in /home/trapper/.wine/drive_d/buzzard/temp/*.log; 
do paste -s /home/trapper/.wine/drive_d/buzzard/addon.txt $i >> /home/trapper/.wine/drive_d/promail/queue/${i/.log}.101;
::: Move original log files off to archive :::
mv /home/trapper/.wine/drive_d/buzzard/temp/* /home/trapper/.wine/drive_f/archive/logs/s-series/

THE PROBLEM:
When I paste addon.txt to the log files it screws up the formatting. The files I am working with are DOS txt format. I end up with files in the queue that the MS-based mail server simply discards because they are not in the required format.

This is what the 101's need to look like:

This is what the 101's look like in gedit:

This is what the 101's look like in windows notepad. This is what the mail server sees and rejects:

I happened upon this code while googling. It has resolved my text format problem. It maintains ms-dos format when appending the files.

for i in *.log; do (echo '0r /home/trapper/.wine/drive_d/buzzard/addon.txt'; echo 'wq') | ed $i; done

That made me make some adjustments to my script. This is what I finally ended up with. It does what I originally wanted to do. As I said previously, I am sure there's a much more efficient and proper way to do all this and, eventually, when I become more knowledgeable in bash scripting, I'll probably change and streamline it. Time's a premium and that just has to wait.

Here's my final code:

# Move all logs, except today's log to a temp dir.

cd /home/trapper/.wine/drive_d/buzzard/logs/s-series
find *.log -daystart -mtime +0 -exec mv {} /home/trapper/.wine/drive_d/buzzard/temp \;

# Send a copy of the logs off to archive.

cd /home/trapper/.wine/drive_d/buzzard/temp
cp *.log /home/trapper/.wine/drive_f/archive/logs/s-series/

# Insert header text and retain current text formatting.

for i in *.log; do (echo '0r /home/trapper/.wine/drive_d/buzzard/addon.txt'; echo 'wq') | ed $i; done

# Bulk rename log files to extension needed by mail server.

ls *|sed 's/\(.*\)\.log/mv \1.log  \1.101/' |sh

# Move .101's to mail queue for delivery.

mv *.101 /home/trapper/.wine/drive_d/promail/queue

That's it.