如何编写一个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
请帮助。 谢谢!
答
如果你只是想在最新的版本号:
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`;
这不是一个答案,只是试图找出语法错误,所以下次你可以避免它们: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
上面的好建议,但不要让我们的语法检查你的脚本,学习使用http://shellcheck.net。你知道“头部”和“尾巴”厘米。如果你可以强制你的输出进行排序,这应该有所帮助。祝你好运。 – shellter
非常感谢,@尼克! – EmbeddedManiac