我需要一个 shell 脚本来查找在创建特定文件 ( test.txt
) 之前 1 小时或之后 1 小时创建的文件。
如果我选择find -newer
,这意味着我必须创建一个临时文件,使用touch
更改文件创建时间之前 1 小时的时间test.txt
,然后使用-newer tempFile
查找比 更新的文件tempFile
,最终找到在 test.txt 文件之前 1 小时创建的文件。然后我必须花一个小时或更长时间重新完成该过程才能找到这些内容较老的比我感兴趣的文件。回答一个简单的问题似乎需要做很多额外的工作。
我也看到了find -mmin
,但我担心它是 POSIX 的扩展find
。
还有其他建议吗?
答案1
尝试以下 shell 代码:
file=</PATH/TO/FILE>
date=$(perl -le '$s = (stat($ARGV[0]))[9]; print $s;' "$file")
now=$(date +%s)
seconds=$((now - date))
mins=$((seconds / 60))
find . -mmin -$((mins + 60 )) -mmin +$((mins - 60)) -print
答案2
另一个复杂的选项:
- get
test.txt
的修改时间 (mtime
) - 计算
"before delta" = now + hour - mtime
(假设mtime
是过去的) - 计算
"after delta" = now - hour - mtime if now - mtime > hour else 0
- 跑步
find -type f -mmin -"before delta" -mmin +"after delta"
它找到所有在“增量之前”分钟之前修改的文件,以及在修改时间大于“增量之后”分钟之前修改的所有文件,即test.txt
修改时间+/-小时左右。
now
如果把, mtime
, "before"
,"after"
次画在一条线上,可能会更容易理解。
date
命令允许获取now
和mtime
。
作为单行:
$ find -type f -newermt "$(date -r $file) -1 hour" -a \
\! -newermt "$(date -r $file) +1 hour"
答案3
你可以这样做:
d=$(TZ=UTC0 date -r test.txt +%Y%m%d%H%M.%S)
或者
d=$(TZ=UTC0 find test.txt -prune -printf '%TY%Tm%Td%TH%TM.%.2TS\n'
或者
d=$(TZ=UTC0 stat -f %Sm -t %Y%m%d%H%M.%S text.txt)
取决于您是否有权访问 GNU date、GNU find 或 BSD stat(不幸的是,没有(合理地)没有 POSIX 和可靠的方法来获取文件的修改时间)
进而:
TZ=XXX-1 touch -t "$d" sooner
TZ=XXX+1 touch -t "$d" later
find . -newer sooner ! -newer later
格式TZ=XXX<offset>
是标准的,意思是定义“XXX”时区相<offset>
对于 UTC 来说是这样的,因此上面 TZ 变量中的“UTC”或“XXX”是任意且无关的。
请注意,find -mmin
、stat
、find -printf
、date +%s
、date -r
(更不用说--reference
)都是可移植的或 POSIX 的。
perl
通常比其中任何一个都更广泛可用,并且您可以使用 perl 完成整个事情(使用File::Find
)。
ksh93
或者zsh
(更容易)也有能力在内部执行整个任务。
我说合理地上面,因为可以获取文件的修改时间(作为纪元时间),只要它的名称不太长并且不包含换行符,POSIXly,但它有点复杂:
{
echo ibase=8
printf '%s\n' test.txt |
pax -x ustar -wd |
dd 2> /dev/null bs=4 skip=34 count=3 |
tr -d '\0'
echo
} | bc
将其转换为 UTC 时区 POSIXly 中的 YYYYmmddHHMM.SS 格式也是可能的,但也相当费力(请参阅http://stchaz.free.fr/wide_strftime.sh举个例子)