Bash
測試文件是否在文件名中的日期之後修改
我
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
,date
和stat
$ 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