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

时间:2017-06-16 20:59:36

标签: shell scripting debian-based

我需要一个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 _(“最高值”)选择文件_ 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

请帮助。 谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

如果您只想要最新版本号:

<!doctype html>
<script>
onload = ()=>{
  console.log(document.body.innerHTML); 
};
</script>
<body> 

pasting raw bytes here, eg:

asdfg <a>  hi  </b> xyz

boundary=gc0p4Jq0M

raw bytes image 1 here

--gc0p4Jq0M

boundary=ggUjM

raw bytes css page 1 here

--ggUjM

boundary=yyJAkM

raw bytes js page 1 here

--yyJAkM

a couple more resources here

如果您想要文件名:

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

答案 2 :(得分:1)

在找到实际文件名之前,无需解析文件名的版本号。使用 GNU ls&#39; s -v文本中的自然类型(版本)号)选项:

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

答案 3 :(得分:1)

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

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