每天,應用程序會創建一個名爲file_YYYYMMDD.csv
的文件,其中YYYYMMDD
是生產日期。但是有時候這個世代會失敗,並且幾天沒有生成任何文件。按生產日期索引的文件
我想要一個簡單的方法在bash或sh腳本中找到最近的文件的文件名,它是在給定的參考日期之前生成的。
典型用法:查找最後生成的文件,無視5月1日之後生成的文件。
感謝您的幫助
每天,應用程序會創建一個名爲file_YYYYMMDD.csv
的文件,其中YYYYMMDD
是生產日期。但是有時候這個世代會失敗,並且幾天沒有生成任何文件。按生產日期索引的文件
我想要一個簡單的方法在bash或sh腳本中找到最近的文件的文件名,它是在給定的參考日期之前生成的。
典型用法:查找最後生成的文件,無視5月1日之後生成的文件。
感謝您的幫助
這個腳本避免:
ls
sed
多次在while
循環創建一個子shellfile_*.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"
謝謝,也很好。 但我更喜歡使用sed的解決方案,因爲它提供了更多的可能性來控制處理哪些文件。例如:有時文件名爲'file_YYYYMMDD_test.csv'出現在目錄中。 我會嘗試混合這兩個腳本來添加您提出的其他改進。 謝謝! – caas 2010-05-13 11:32:22
@caas:查看我編輯的使用Bash正則表達式的版本,與'sed'版本類似。 – 2010-05-13 14:05:08
試試這個:
#!/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
整潔! 是否可以在沒有「echo $ fn」管道的情況下執行此操作(即直接將$ fn作爲參數傳遞給sed)? – caas 2010-05-12 22:23:42
由於sed對輸入進行操作,因此您必須對其進行迴應。你當然可以使用「這裏的文件」,但這樣更復雜。在讀取行之前,您還可以通過sed輸出ls的輸出。但在這種情況下,您必須在回顯它時重新創建文件名。 – petersohn 2010-05-13 07:20:08
謝謝,這第二個腳本非常優雅。 Dennis Williamson建議避免分析ls並處理與模式不匹配的文件,我會稍微用一下'find'替換'ls'。 – caas 2010-05-13 11:40:30
排序文件名以人1如果文件名中有換行符,排序會失敗。
相反,我們應該使用類似:
touch $'filename\nwith\777pesky\177chars.txt' # create a test file
ls -1db *
find ... -print0 | LC_ALL=C sort0 ...
見:
查找子目錄下的所有使用的擴展,
你問找到最近的文件名文件名作爲一個關閉或作爲腳本的一部分? – Casey 2010-05-12 21:40:26
我想將它放入一個變量中,以便在腳本中使用它。我看到了很多實現這個目標的方法,但沒有一個很簡單。 – caas 2010-05-12 21:49:15