2017-06-16 116 views
3

我需要一個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

回答

2

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

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 
2

您可以嘗試以下方法,它查找所有匹配的文件,對文件名進行排序,獲取列表中的最後一個,然後從文件名中提取版本。

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

在查找實際文件名之前,不必解析文件名的版本號。使用GNUls-v自然排序文本內(版本)號)選項:

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

我曾嘗試和多數民衆爲之工作下面的腳本行,你需要的。

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