2011-05-23 85 views
5

我正在開發一個bash腳本,它需要根據一個變量指定需要通過多少天才能在一個單獨的「舊」目錄中搜索文件超過閾值並且文件被標記爲操作(可以是從移動到存檔以進行刪除等任何操作)。bash腳本查找文件名中的基於日期的舊文件

問題在於,在確定文件在採取動作之前需要多大的文件時,文件的修改時間無關緊要,因爲文件很少發生更改,腳本的執行時間可能會有所不同,等等。

決定保存文件的時間是以YYYY-MM-DD(或帶有date命令的%F)形式存在於實際文件名中。取例如文件名內容2011-05-23.txt。在這個目錄下可以運行哪些命令來查找超過一定天數的所有文件(我的閾值目前設置爲7天,可能會更改)並打印出它們的文件名?

回答

2

在BSD,所述-j用於防止所設置的日期和-f參數用於設定輸入的日期的格式。 :

首先,你需要找到今天的天數日期自1970年1月1日:

today=$(date -j -f "%Y-%m-%d" 1969-12-31 +%s) 

現在,你可以用它來找出時間七天前:

((cutoff = $today - 604800)) 

數字604800是七天內的秒數。

現在,對於目錄中的每個文件,都需要找到字符串的日期部分。我不知道更好的方法。 (也許有人知道一些Bash魔法)。

find . -type f | while read fileName 
do 
    fileDate=$(echo $foo | sed 's/.*-\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/') 
    yadda, yadda, yadda #Figure this out later 
done 

一旦我們有文件的日期,我們可以使用日期命令,如果該日期要弄清楚在幾秒鐘不到(因此比截止日期之前)

today=$(date -j -f "%Y-%m-%d" 1969-12-31 +%s) 
((cutoff = $today - 604800)) 
find . -type f | while read fileName #Or however you get all the file names 
do 
    fileDate=$(echo $foo | sed 's/.*-\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/') 
    fileDateInSeconds=$(date -j -f "%Y-%m-%d" $fileDate +%s) 
    if [ $fileDateInSeconds -lt $cutoff ] 
    then 
      rm $fileName 
    fi 
done 

在Linux中,您使用-d參數來定義必須是在YYYY-MM-DD格式的日期:

today=$(date +"%Y-%m-%d) 

現在,您可以採取的,找到的秒數:

todayInSeconds=(date -d $today +%s) 

其他一切應該或多或少與上述相同。

0

如果你每天運行的命令,你可以這樣做:

echo *-`date -d '8 days ago' '+%F'`.txt 

附加通配符可以ofcourse

5

加入創建一個bash腳本isOld.sh這樣的:

#!/bin/bash 

fileName=$1 
numDays=$2 

fileDt=$(echo $fileName | sed 's/^[^-]*-\([^.]*\)\..*$/\1/') 
d1=$(date '+%s') 
d2=$(date -d $fileDt '+%s') 
diff=$((d1-d2)) 
seconds=$((numDays * 24 * 60 * 60)) 
[[ diff -ge seconds ]] && echo $fileName 

然後通過運行給予上述文件的執行許可:

chmod +x ./isOld.sh 

最後運行這從目錄的頂部找到命令打印文件超過7天爲:

find . -name "contents-*" -exec ./isOld.sh {} 7 \; 
+0

+1難以擊敗 – leonbloy 2011-05-23 17:52:42

0
find *[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]*.txt -exec bash -c 'dt=`echo $0 | sed -re "s/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/"`; file_time=`date -d $dt +%s`; cutoff_time=`date -d "31 days ago" +%s` ; test $file_time -lt $cutoff_time ' {} \; -print 

這是我最長的一個襯墊之一:-)這再次包裝:

find *[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]*.txt \ 
    -exec bash -c ' dt=`echo $0 | \ 
        sed -re "s/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/"`; \ 
        file_time=`date -d $dt +%s`; \ 
        cutoff_time=`date -d "31 days ago" +%s` ;\ 
        test $file_time -lt $cutoff_time \ 
       ' {} \; -print 
相關問題