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

问题描述:

我需要一个shell脚本来查找文件中的字符串,如下所示: FileName_1.00_r0102.tar.gz 然后从多次出现中选取最高值。如何编写一个shell脚本来读取目录中的所有文件名并在文件名中查找特定的字符串?

我对“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_(“最高值”)的文件_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 

请帮助。 谢谢!

+2

这不是一个答案,只是试图找出语法错误,所以下次你可以避免它们:1)在for循环中需要'do':'for ....; do ....; done' 2)当你设置一个变量时,你不能在等号:'file_version = 5',* not *'file_version = 5' 3)设置一个变量来包含输出一个命令,你需要[命令替换](https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html):'file_version = $(command)'4)不是语法错误,但引用变量赋值的RHS是个好主意:'file_version =“$(command)”'。 – Nick

+1

上面的好建议,但不要让我们的语法检查你的脚本,学习使用http://shellcheck.net。你知道“头部”和“尾巴”厘米。如果你可以强制你的输出进行排序,这应该有所帮助。祝你好运。 – shellter

+0

非常感谢,@尼克! – EmbeddedManiac

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

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 

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

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

在查找实际文件名之前,不必解析文件名的版本号。使用GNUls-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`;