我需要一个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
请帮助。 谢谢!
答案 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`;