2016-12-01 102 views
0

所以我有一堆文件的文件夾。 文件,文件0,文件1,文件.2查找bash腳本中文件擴展名最大的索引

我試圖找到這個文件的擴展名中最大的index。所以它必須是2.

我寫了這個命令,它用numeric extension統計所有文件。 但是當索引大於10時它不能正常工作。它根本不工作,因爲我只想找到最大的索引,而不是索引中帶有數字的文件的總和。

$1 (is file name in this case File) 

y=$(echo $(ls -d $1.[0-inf] | wc -l)) 

我該怎麼做?

+0

會發生什麼事時,你的說法'$ 1'是'File.1'?你想搜索名爲'Files.1.0','Files.1.1','Files.1.2'等文件嗎? – Aserre

+0

是的。指數表示最後一個點之後的值。 – davoid

回答

2

第一條提示:do not parse the output of ls。特別是在你的情況。

你可以使用下面的腳本在純bash的解決您的問題:

#!/bin/bash 

# needed for correct glob expansion 
shopt -s nullglob 

# we check every file following the format $1.extension 
max_index=0 
for f in $1.* 
do 
    # we retrieve the last extension 
    ext=${f##*.} 
    re="^[0-9]+$" 

    # if ext is a number and greater than our max, we store it 
    if [[ $ext =~ $re && $ext -gt $max_index ]] 
    then 
     max_index=$ext 
    fi 
done 
echo $max_index 
+0

這個什麼的所有文件的清單? 'Y = $(回聲$(LS -d $ 1 * [0-9] * |的sed的/ [^ 0-9] * // G')。) 最大= 0 在$ y的V;如果[$ v -gt $ max];則執行 ;然後 max = $ v fi done' – davoid

+0

@davoid當文件不存在時:'ls:can not access'nothing。* [0-9] *':沒有這樣的文件或目錄。這就是爲什麼你在這種情況下不使用'ls'的原因 – Aserre

+0

好的。謝謝你提供信息。但我認爲該文件存在。 – davoid

1

你可以試試這個:

for i in file\.*; do echo ${i##*.}; done | sort -g | tail -n1 

${i##*.}在文件名的最後一個.之前刪除一切。

sort -g正在排序爲數字值。

tail -n1打印最後一個索引。

更容易出錯的方法是使用find命令作爲它會與文件不匹配的圖案,文件名用空格應付...

find -type f -name "file\.*" -exec bash -c 'echo ${1/*\.}' _ "{}" \; 2>/dev/null | sort -n | tail -n1 

bash -c 'echo ${1/*\.}' _ "{}"是將前剝離字符命令.

您可能需要在命令的開頭添加-maxdepth 1以避免在目錄內遞歸查看。

+0

如果有下面的命名模式沒有文件,你的腳本將返回當前目錄 – Aserre