我需要做的是按照另一个文件的创建时间查找文件。例如,如果我在上午9点创建一个文件,之后我想找到它之后1小时或之前1小时创建的所有文件。我该怎么做?
我尝试使用“发现”尝试“-newer”,但我认为“xargs”是我需要使用的。
谢谢
答案 0 :(得分:1)
我知道这太糟糕了,但因为我一直在寻找同样的东西...... 这是一个oneliner版本,基本上使用与上面相同的方法:
至少一小时后修改:
find . -newermt "$(date -d "$(stat -c %y reference_file) + 1 hour")"
提前一小时或更长时间修改:
find . -not -newermt "$(date -d "$(stat -c %y reference_file) - 1 hour")"
在前一小时到后一小时的时间跨度内修改
find . -newermt "$(date -d "$(stat -c %y reference_file) - 1 hour")" -not -newermt "$(date -d "$(stat -c %y reference_file) + 1 hour")"
用您选择的文件替换 reference_file
。您当然也可以使用其他时间跨度而不是 1 hour
stat -c %y reference_file
将返回修改时间。
date -d "[...] + 1 hour"
会将日期字符串处理为一小时后。
find . -newermt "[...]"
将查找修改时间 (m
) 比给定时间 (t
) 新的文件
所有这些都需要 GNU find 4.3.3 或更高版本(用于 -newerXY
)和 GNU date(以支持 -d
和复杂的日期字符串)
答案 1 :(得分:0)
看了这个后我发现了一种方法,虽然它不是最好的解决方案,因为它需要按时完成整数运算。
我们的想法是从你的参考文件中获取自Unix时代(也称为Unix时间)以来的秒数,对此进行一些整数运算以获得你的偏移时间(在你的例子之前或之后一小时)。然后使用带有-newer
参数的find。
示例代码:
# Get the mtime of your reference file in unix time format,
# assumes 'reference_file' is the name of the file you're using as a benchmark
reference_unix_time=$(ls -l --time-style=+%s reference_file | awk '{ print $6 }')
# Offset 1 hour after reference time
let unix_time_after="$reference_unix_time+60*60"
# Convert to date time with GNU date, for future use with find command
date_time=$(date --date @$unix_time_after '+%Y/%m/%d %H:%M:%S')
# Find files (in current directory or below)which are newer than the reference
# time + 1hour
find . -type f -newermt "$date_time"
对于您在参考文件前一小时创建的文件示例,您可以使用
# Offset 1 hour before reference time
let unix_time_before="$reference_unix_time-60*60"
# Convert to date time with GNU date...
date_time=$(date --date @$unix_time_before '+%Y/%m/%d %H:%M:%S')
# Find files (in current directory or below which were generated
# upto 1 hour before the reference file
find . -type f -not -newermt "$date_time"
请注意,以上所有内容均基于文件的上次修改时间。
以上内容已经过GNU Find(4.5.10),GNU Date(8.15)和GNU Bash(4.2.37)的测试。