0

我需要做的是通过另一个文件的创建时间来查找文件。例如,如果我在上午 9 点创建一个文件,然后我想查找在它之后 1 小时或在它之前 1 小时创建的所有文件。我该怎么做?

我在使用“find”的同时尝试使用“-newer”,但我认为“xargs”是我需要使用的。

谢谢

4

2 回答 2

1

我知道这是ooooold,但因为我一直在寻找同样的东西......这是一个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 或更高版本(for -newerXY)和 GNU date(以支持-d和复杂的日期字符串)

于 2021-06-26T08:17:49.363 回答
0

在看了这个之后,我找到了一种方法来做到这一点,虽然它不是最好的解决方案,因为它需要按时完成整数运算。

这个想法是从您的参考文件中获取自 Unix 纪元(又名 Unix 时间)以来的秒数,对此进行一些整数运算以获得您的偏移时间(在您的示例中为一小时之前或之后)。然后你使用 find 和-newer参数。

示例代码:

# 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) 进行了测试。

于 2012-09-26T20:07:30.190 回答