MLSC
MLSC

Reputation: 5972

Using counter each time you run bash script

Imagine I have a directory with these files:

file-1.txt  file-2.txt ...

I want to write a condition for my bash and check if file-2.txt exists then write output to file-3.txt

sample bash script file:

while read line;do
    <A command here> #could be anything
    if [ "$?" -eq "0" ]; then
        echo "$line" >> file-$counter.txt  #Pay attention to counter here
    fi
done < $LIST

When bash is finished running and stopped. then I want to run it again. now I want to chech if last file is blah blah then tell the counter to write output to new file.

Upvotes: 0

Views: 285

Answers (1)

paxdiablo
paxdiablo

Reputation: 881453

You can get the last number of a file with a series of commands, then add one to get the next:

pax> ll file-*.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-1.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-10.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-11.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-12.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-13.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-14.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-15.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-2.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-3.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-4.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-5.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-6.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-7.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-8.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-9.txt

pax> next=$(expr $(ls -1 file-*.txt |sed 's/file-//;s/.txt$//' |sort -nk1 |tail -1) + 1)

pax> echo $next
16

Then you can just use that to create the next one:

pax> touch file-${next}.txt

pax> ll file-*.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-1.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-10.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-11.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-12.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-13.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-14.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-15.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:23 file-16.txt  <== here it is
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-2.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-3.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-4.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-5.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-6.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-7.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-8.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-9.txt

Breaking that line down command by command:

ls -1 file-*.txt           # get all files one per line.
sed 's/file-//;s/.txt$//'  # get rid of "file-" and '.txt', leaves numbers only.
sort -nk1                  # numerically sort (1..15).
tail -1                    # get last entry only (15).
expr $(... + 1)            # add one (16).
next=$(...)                # assign it to "next" variable.

It's not always a good idea to parse the output of ls since filenames can sometimes contain unusual characters. But, if you can guarantee they'll meet your specifications, this will work fine.

Upvotes: 1

Related Questions