bug-findutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: -used not working correctly?


From: Bernhard Voelker
Subject: Re: -used not working correctly?
Date: Mon, 18 Nov 2019 00:13:10 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.1

On 2019-11-14 17:48, Martin Schulte wrote:
> Hello,
> 
> I create files t<n> (n=1,3,5,7) with ctime=now and atime=now+<n> days:
> 
> $ uname -a
> $ echo
> $ find --version
> $ for d in 1 3 5 7; do
>>   touch -a -d "$(date -d "$d day" '+%Y-%m-%d %H:%M:%S')" t$d
>> done
> $ echo
> $ echo find:
> $ find . -name 't?' -used +4
> $ echo done.
> 
> I expect
> ./t5
> ./t7
> as output from find but I get nothing:
> 
> Linux martnix4 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u1 (2019-09-20)
> x86_64 GNU/Linux
> 
> find (GNU findutils) 4.7.0-git
> Copyright (C) 2016 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>. This is free software: you are free
> to change and redistribute it. There is NO WARRANTY, to the extent
> permitted by law.
> 
> Written by Eric B. Decker, James Youngman, and Kevin Dalley.
> Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS
> (FTS_CWDFD) CBO(level=2) 
> 
> find:
> done.
> 
> Do I misunderstand the man page? If this is a bug, it looks as if
> pred_used calls pred_timewindow with a bad second argument (absolute time
> iso relative to ctime).
> 
> Best regards,
> 
> Martin

Thank you for the bug report.

First of all, I have the impression that the -used predicate may often
suffer from 'noatime' or 'relatime' mounts nowadays.

Re. the problem: after a quick look at the sources I see 2 problems:

a) the 'timespec delta' is reversed.
It seems that this bug sneaked somehow in during the introduction of
sub-second timestamp resolution back in 2007.

b) the function pred_used should return false if atime < ctime.
Such a condition has to be added because the -used predicate shall
evaluate to true:
  1. with "-used -N": if atime is less than N days after ctime.
  2. with "-used  N": if atime is exactly   N days after ctime.
  3. with "-used +N": if atime is more than N days after ctime.
Therefore, if atime is before ctime, then -used with any argument
should evaluate to false.

The attached (raw git diff) fixes both.

Your test case would then look like the following:

  $ rm t*  # remove because otherwise 'touch' would always also set the ctime.

  $ for d in 1 3 5 7; do \
      touch -a -d "$(date -d "$d day" '+%Y-%m-%d %H:%M:%S')" t$d ; \
    done

  $ stat -c "Name: %n  Access: %x  Change: %z" t?
  Name: t1  Access: 2019-11-18 23:04:17.000000000 +0100  Change: 2019-11-17 
23:04:17.147805944 +0100
  Name: t3  Access: 2019-11-20 23:04:17.000000000 +0100  Change: 2019-11-17 
23:04:17.151806001 +0100
  Name: t5  Access: 2019-11-22 23:04:17.000000000 +0100  Change: 2019-11-17 
23:04:17.155806059 +0100
  Name: t7  Access: 2019-11-24 23:04:17.000000000 +0100  Change: 2019-11-17 
23:04:17.159806116 +0100

  $ for f in -8 -7 -6 -5 -4 -3 -2 -1 -0 0 +0 +1 +2 +3 +4 +5 +6 +7 +8; do \
      set -x ; \
      find . -type f -used $f; \
      { set +x; } 2>/dev/null; \
    done
  + find . -type f -used -8
  ./t7
  ./t5
  ./t3
  ./t1
  + find . -type f -used -7
  ./t7
  ./t5
  ./t3
  ./t1
  + find . -type f -used -6
  ./t5
  ./t3
  ./t1
  + find . -type f -used -5
  ./t5
  ./t3
  ./t1
  + find . -type f -used -4
  ./t3
  ./t1
  + find . -type f -used -3
  ./t3
  ./t1
  + find . -type f -used -2
  ./t1
  + find . -type f -used -1
  ./t1
  + find . -type f -used -0
  + find . -type f -used 0
  + find . -type f -used +0
  ./t7
  ./t5
  ./t3
  ./t1
  + find . -type f -used +1
  ./t7
  ./t5
  ./t3
  + find . -type f -used +2
  ./t7
  ./t5
  ./t3
  + find . -type f -used +3
  ./t7
  ./t5
  + find . -type f -used +4
  ./t7
  ./t5
  + find . -type f -used +5
  ./t7
  + find . -type f -used +6
  ./t7
  + find . -type f -used +7
  + find . -type f -used +8

I'll try to come up with a proper patch - maybe including a test
case - in the next few days (although a look into my calendar for this
week doesn't leave much hope for this).

Have a nice day,
Berny

Attachment: pred-used.patch
Description: Text Data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]