如何编写一个 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
我需要一个 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