OmkarK
OmkarK

Reputation: 189

How to write a shell script that reads all the file names in the directory and finds a particular string in file names?

I need a shell script to find a string in file like the following one: FileName_1.00_r0102.tar.gz And then pick the highest value from multiple occurrences.

I am interested in "1.00" part of the file name. I am able to get this part separately in the UNIX shell using the commands:

find /directory/*.tar.gz | cut -f2 -d'_' | cut -f1 -d'.'
1
2
3
1
find /directory/*.tar.gz | cut -f2 -d'_' | cut -f2 -d'.'
00
02
05
00

The problem is there are multiple files with this string:

FileName_1.01_r0102.tar.gz

FileName_2.02_r0102.tar.gz

FileName_3.05_r0102.tar.gz

FileName_1.00_r0102.tar.gz

I need to pick the file with FileName_("highest value")_r0102.tar.gz

But since I am new to shell scripting I am not able to figure out how to handle these multiple instances in script.

The script which I came up with just for the integer part is as follows:

#!/bin/bash
for file in /directory/*
file_version = find /directory/*.tar.gz | cut -f2 -d'_' | cut -f1 -d'.'
done
OUTPUT: file_version:command not found

Kindly help. Thanks!

Upvotes: 3

Views: 648

Answers (4)

fd0
fd0

Reputation: 298

If you just want the latest version number:

cd /path/to/files
printf '%s\n' *r0102.tar.gz | cut -d_ -f2 |  sort -n -t. -k1,2 |tail -n1

If you want the file name:

cd /path/to/files
lastest=$(printf '%s\n' *r0102.tar.gz | cut -d_ -f2 |  sort -n -t. -k1,2 |tail -n1)
printf '%s\n' *${lastest}_r0102.tar.gz

Upvotes: 2

agc
agc

Reputation: 8406

It's unnecessary to parse the filename's version number prior to finding the actual filename. Use GNU ls's -v (natural sort of (version) numbers within text) option:

ls -v FileName_[0-9.]*_r0102.tar.gz | tail -1

Upvotes: 1

Harini
Harini

Reputation: 571

I have tried and thats worth working below script line, that You need.

echo `ls ./*.tar.gz | sort | sed  -n /[0-9]\.[0-9][0-9]/p|tail -n 1`;

Upvotes: 1

Jonathan
Jonathan

Reputation: 1402

You could try the following which finds all the matching files, sorts the filenames, takes the last in that list, and then extracts the version from the filename.

#!/bin/bash
file_version=$(find ./directory -name "FileName*r0102.tar.gz" | sort | tail -n1 | sed -r 's/.*_(.+)_.*/\1/g')
echo ${file_version}

Upvotes: 2

Related Questions