Bash

測試文件是否在文件名中的日期之後修改

  • October 29, 2015

YYYYMMDD在文件名中有一個名為的文件,例如

file-name-20151002.txt

我想確定這個文件是否在 2015 年 10 月 2 日之後被修改。

筆記:

  • 我可以通過查看 的輸出來做到這一點ls,但我知道解析 的輸出ls是個壞主意。
  • 我不需要查找特定日期之後的所有文件,只需要一次測試**一個特定文件。
  • 我不擔心文件在創建後的同一日期被修改。也就是說,我只想知道這個20151002名稱中的文件是否在 2015 年 10 月 3 日或之後被修改。
  • 我在 MacOs 10.9.5 上。

以下是一些可能的方法:

  • OSX stat:
newer () {
tstamp=${1:${#1}-12:8}
mtime=$(stat -f "%Sm" -t "%Y%m%d" "$1")
[[ ${mtime} -le ${tstamp} ]] && printf '%s\n' "$1 : NO: mtime is ${mtime}" || printf '%s\n' "$1 : YES: mtime is ${mtime}"
}
  • GNU date:
newer () {
tstamp=${1:${#1}-12:8}
mtime=$(date '+%Y%m%d' -r "$1")
[[ ${mtime} -le ${tstamp} ]] && printf '%s\n' "$1 : NO: mtime is ${mtime}" || printf '%s\n' "$1 : YES: mtime is ${mtime}"
}
  • zsh只要:
zmodload zsh/stat
newer () {
tstamp=${1:${#1}-12:8}
mtime=$(zstat -F '%Y%m%d' +mtime -- $1)
[[ ${mtime} -le ${tstamp} ]] && printf '%s\n' "$1 : NO: mtime is ${mtime}" || printf '%s\n' "$1 : YES: mtime is ${mtime}"
}

用法:

較新*的文件*

範例輸出:

file-name-20150909.txt : YES: mtime is 20151026

或者

file-name-20151126.txt : NO: mtime is 20151026

以下腳本將檢查命令行上指定的所有文件的日期:

它需要 GNU 版本的sed,datestat

$ cat check-dates.sh 
#! /bin/bash

for f in "$@" ; do
 # get date portion of filename
 fdate=$(basename "$f" .txt | sed -re 's/^.*(2015)/\1/')

 # convert it to seconds since epoch + 1 day
 fsecs=$(echo $(date +%s -d "$fdate") + 86400 | bc )

 # get modified timestamp of file in secs since epoch
 ftimestamp=$(stat -c %Y "$f")

 [ "$ftimestamp" -gt "$fsecs" ] && echo "$f has been modified after $fdate"
done

$ ./check-dates.sh file-name-20151002.txt 
file-name-20151002.txt has been modified after 20151002
$ ls -l file-name-20151002.txt 
-rw-rw-r-- 1 cas cas 0 Oct 26 19:21 file-name-20151002.txt

這是一個未經測試的版本,但如果我正確閱讀了線上手冊頁,它應該可以在 Mac(和 FreeBSD 等)上執行:

#! /bin/bash

for f in "$@" ; do
 # get date portion of filename
 fdate=$(basename "$f" .txt | sed -e 's/^.*\(2015\)/\1/')

 # convert it to seconds since epoch + 1 day
 fsecs=$(echo $(date -j -f %Y%m%d "$fdate" +%s) + 86400 | bc )

 # get modified timestamp of file in secs since epoch
 ftimestamp=$(stat -f %m "$f")

 [ "$ftimestamp" -gt "$fsecs" ] && echo "$f has been modified after $fdate"
done

引用自:https://unix.stackexchange.com/questions/238639