2010-05-12 54 views
2

每天,應用程序會創建一個名爲file_YYYYMMDD.csv的文件,其中YYYYMMDD是生產日期。但是有時候這個世代會失敗,並且幾天沒有生成任何文件。按生產日期索引的文件

我想要一個簡單的方法在bash或sh腳本中找到最近的文件的文件名,它是在給定的參考日期之前生成的。

典型用法:查找最後生成的文件,無視5月1日之後生成的文件。

感謝您的幫助

+0

你問找到最近的文件名文件名作爲一個關閉或作爲腳本的一部分? – Casey 2010-05-12 21:40:26

+0

我想將它放入一個變量中,以便在腳本中使用它。我看到了很多實現這個目標的方法,但沒有一個很簡單。 – caas 2010-05-12 21:49:15

回答

0

這個腳本避免:

  • 在一個循環
  • Parsing ls
  • 使用sed多次在while循環創建一個子shell
  • 處理文件不匹配file_*.csv名圖案

這裏的腳本:

#!/bin/bash 
while read -r file 
do 
    date=${file#*_} # strip off everything up to and including the underscore 
    date=${date%.*} # strip off the dot and everything after 
    if [[ $date < $1 ]] 
    then 
     break 
    fi 
done < <(find -name "file_*.csv" | sort -r) 

# do something with $file, such as: 
echo "$file" 

編輯:

使用bash> = 3.2,則可以使用正則表達式做到這一點:

#!/bin/bash 
regex='file_([[:digit:]]+).csv' 
while read -r file 
do 
    [[ $file =~ $regex ]] 
    date=${BASH_REMATCH[1]} 
    if [[ $date < $1 ]] 
    then 
     break 
    fi 
done < <(find -name "file_*.csv" | sort -r) 

# do something with $file, such as: 
echo "$file" 
+0

謝謝,也很好。 但我更喜歡使用sed的解決方案,因爲它提供了更多的可能性來控制處理哪些文件。例如:有時文件名爲'file_YYYYMMDD_test.csv'出現在目錄中。 我會嘗試混合這兩個腳本來添加您提出的其他改進。 謝謝! – caas 2010-05-13 11:32:22

+0

@caas:查看我編輯的使用Bash正則表達式的版本,與'sed'版本類似。 – 2010-05-13 14:05:08

0

試試這個:

#!/bin/bash 

ls -r | while read fn; do 
    date=`echo $fn | sed -e 's/^file_\([0-9]*\)\.csv$/\1/'` || continue 
    if [ $date -lt $1 ]; then 
     echo $fn 
     exit 
    fi 
done 

只需撥打這個腳本要使用比較基準日期。如果要包含參考日期,請將-lt替換爲-le

編輯:一種替代解決方案,無需管道回顯變量。請注意,我沒有測試它,但它也應該可以工作。

#!/bin/bash 

ls -r | sed -e 's/^file_\([0-9]*\)\.csv$/\1/' | while read date; do 
    if [ $date -lt $1 ]; then 
     echo "file_${date}.csv" 
     exit 
    fi 
done 
+0

整潔! 是否可以在沒有「echo $ fn」管道的情況下執行此操作(即直接將$ fn作爲參數傳遞給sed)? – caas 2010-05-12 22:23:42

+0

由於sed對輸入進行操作,因此您必須對其進行迴應。你當然可以使用「這裏的文件」,但這樣更復雜。在讀取行之前,您還可以通過sed輸出ls的輸出。但在這種情況下,您必須在回顯它時重新創建文件名。 – petersohn 2010-05-13 07:20:08

+0

謝謝,這第二個腳本非常優雅。 Dennis Williamson建議避免分析ls並處理與模式不匹配的文件,我會稍微用一下'find'替換'ls'。 – caas 2010-05-13 11:40:30

0

排序文件名以人1如果文件名中有換行符,排序會失敗。

相反,我們應該使用類似:

touch $'filename\nwith\777pesky\177chars.txt' # create a test file 

ls -1db * 

find ... -print0 | LC_ALL=C sort0 ... 

見:

查找子目錄下的所有使用的擴展,

http://codesnippets.joyent.com/posts/show/2300