如何编写一个 shell 脚本来读取目录中的所有文件名并找到文件名中的特定字符串?

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

我需要一个 shell 脚本来查找文件中的字符串,如下所示: FileName_1.00_r0102.tar.gz 然后从多次出现中选择最高值。

我对文件名的“1.00”部分感兴趣。 我可以使用以下命令在 UNIX shell 中单独获取此部分:

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

问题是有多个文件包含此字符串:

FileName_1.01_r0102.tar.gz

FileName_2.02_r0102.tar.gz

FileName_3.05_r0102.tar.gz

FileName_1.00_r0102.tar.gz

我需要选择 FileName_("highest value")_r0102.tar.gz

的文件

但是由于我是 shell 脚本编写的新手,所以我不知道如何在脚本中处理这些多个实例。

我为整数部分想出的脚本如下:

#!/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

请帮忙。 谢谢!

您可以尝试以下方法,它会找到所有匹配的文件,对文件名进行排序,取列表中的最后一个,然后从文件名中提取版本。

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

在找到实际文件名之前不需要解析文件名的版本号。使用 GNU ls-v文本中自然排序的(版本)数字)选项:

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

我已经尝试过,这值得在您需要的脚本行下工作。

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

如果你只想要最新的版本号:

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

如果要文件名:

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