2017-10-09 67 views
2

我有跨多個目錄的一組數據文件的格式與通過bash獲取某組文件中最高後綴(或前綴)的最簡潔方法?

ls lcp01/output/ 
> dst000.dat dst001.dat ... dst075.dat nn000.dat nn001.dat ... nn036.dat aa000.dat aa001.dat ... aa040.dat 

也就是說,有通過lcp25一組目錄lcp01具有不同的數據文件在它們的輸出文件夾的集合。我想知道每個目錄中最高數字dstXXX.dat文件是什麼(在示例中顯示結果將爲75)。

我寫了一個腳本,用於實現這一功能,但我並不滿足於這感覺有點哈克的最後一步:

#!/bin/bash 

for i in `seq -f "%02g" 1 25`; #specify dir extensions 1 through 25 
do 
    echo " " 
    echo $i 
    names=($(ls lcp$i/output | grep dst)) #dir containing dst files 

    NUMS=() 
    for j in "${names[@]}"; 
    do 
      temp="$(echo $j | tr -dc '0-9' && printf " ")" # record suffixes for each dst file 
      NUMS+=("$((10#$temp))") #force base 10 interpretation of dst suffixes 
    done 

    numList="$(echo "${NUMS[*]}" | sort -nr | head -n1)" 
    echo ${numList:(-3)} #print out the last 3 characters of the sorted list - the largest file suffix 
done 

最後兩個步驟組織輸出指數的列表,然後我展示該列表的最後3個字符將是我最大的文件編號(提供的文件編號小於100)。

有沒有更乾淨的方式做到這一點?理想情況下,我希望更多地控制輸出格式,但主要是讀取最後3個字符的步驟。我希望能夠輸出最大的數字,這應該是列表的最後一個元素,但我不知道如何。

回答

2

你可以做類似如下:

for d in lc[0-9][0-9]; do find $d -name 'dst*.dat' -print | sort -u | tail -n1; done 

上面的命令,如果編號有相同的位數(dst001..999.dat)只會工作,因爲它歸類爲一個字符串;如果不是這種情況:

for d in lc[0-9][0-9]; do echo -n $d: ; find $d -name 'dst*.dat' -print | grep -o '[0-9]*.dat' | sort -n | tail -n1; done 
0

使用文件名擴展

for d in lcp*/output; do 
    files=($d/dst*.dat) 
    file=${files[-1]} 
    [[ -e $file ]] || continue 
    file=${file#dst*} 
    echo ${file%.dat} 
done 

或擴展選項來限制模式數字

shopt -s extglob 
... lcp*([0-9])/output 
... $d/dst*([0-9]).dat 
... 
    file=${file##dst*(0)} 
...