bugfindutils - Bugs: bug #50259, -printf %h behaves weirdly with...

 
 

bug #50259: -printf %h behaves weirdly with trailing slashes

Submitted by:  Tavian Barnes <tavianator>
Submitted on:  Thu 09 Feb 2017 01:12:01 AM UTC  
 
Category: findSeverity: 3 - Normal
Item Group: Wrong resultStatus: Fixed
Privacy: PublicAssigned to: Bernhard Voelker <berny>
Originator Name: Tavian BarnesOpen/Closed: Open
Release: 4.6.0Fixed Release: None

Add a New Comment(Rich Markup)
   

You are not logged in

Please log in, so followups can be emailed to you.

 

(Jump to the original submission Jump to the original submission)

Tue 21 Feb 2017 09:38:02 AM UTC, comment #13:

Hi Eric,

would you mind to prepare the test cases (plus the expected output)
for "-printf %h" for cases with /, //, /./, //foo, etc. which you'd
like to have changed?

BTW: I'm not sure the current behavior for a single '/' is correct;
it doesn't seem to be documented at least:

$ find / -maxdepth 0 -printf "'%h'\n"
''

Thanks & have a nice day,
Berny

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Mon 20 Feb 2017 07:48:25 PM UTC, comment #12:

Thanks for your concern.
I think that's a different story:

$ ./find / // /// -maxdepth 0 -printf "'%h'\n"
''
'/'
'//'

$ /usr/bin/find / // /// -maxdepth 0 -printf "'%h'\n"
''
'/'
'//'

The commit didn't change this - it just fixed the issue with the trailing slash(es) without changing anything else.

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Mon 20 Feb 2017 07:06:39 PM UTC, comment #11:

You need to make sure 'find // -printf %h' does not corrupt leading // (which POSIX allows to be distinct from /).

Eric Blake <ericb>
Project Administrator
Mon 20 Feb 2017 05:57:39 PM UTC, comment #10:

No comment, so I pushed - with a slightly better NEWS entry
and commit message at:

https://git.sv.gnu.org/cgit/findutils.git/commit/?id=2a6129bfcc

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Fri 17 Feb 2017 12:46:46 AM UTC, comment #9:

It turned out to become clearer code when stripping off
all trailing directory separators is done first.

Patch v2 attached.

(file #39769)

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Tue 14 Feb 2017 07:07:12 AM UTC, comment #8:

Hmm, also the other case, i.e., for multi-dir pathnames has
the same bug:

$ find foo//bar// -printf "%%p=%p, %%h=%h, %%f=%f -> %%h/%%f=%h/%f\n"
%p=foo//bar//, %h=foo//bar/, %f=bar/ -> %h/%f=foo//bar//bar/

I'll fix that, too.

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Mon 13 Feb 2017 06:48:32 AM UTC, comment #7:

You're right, I missed the following test case:

$ ./find foo// -printf "%p,%h,%f\n"
foo//,foo/,foo/
foo//bar,foo/,bar

I'll send an update soon.

Thanks & have a nice day,
Berny

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Mon 13 Feb 2017 02:29:42 AM UTC, comment #6:

Great! Why limit it to a single trailing slash though?

Tavian Barnes <tavianator>
Sun 12 Feb 2017 01:27:07 PM UTC, comment #5:

With that patch, you can also have a look on what's changed
compared to the installed version with the following snippet:

$ mkdir -p foo/bar
$ ln -snf foo foolink

$ for opt in '' -H -L -P ; do
printf "\n=== Differences for option: '%s' ===\n" "$opt"
diff -u0 \
<( /usr/bin/find $opt {,./}{/,.,foo,foolink}{,/,/.} -maxdepth 1 -printf "%h/%f,%%p=%p,%%h='%h',%%f='%f'\n" ) \
<( ./find $opt {,./}{/,.,foo,foolink}{,/,/.} -maxdepth 1 -printf "%h/%f,%%p=%p,%%h='%h',%%f='%f'\n" )
done | column -t -s,

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Sun 12 Feb 2017 01:15:42 PM UTC, comment #4:

The attached patch fixes this. I also added some more test
cases for "%h".

Have a nice day,
Berny

(file #39733)

Bernhard Voelker <berny>
Project MemberIn charge of this item.
Sat 11 Feb 2017 07:50:00 PM UTC, comment #3:

Yes, you're right, I think one is needed. From your example:
$ find foo/ -printf '%h/%f\n'
foo/foo/
foo/bar

I assume that (in your test case) foo/foo does not actually exist. That isn't really the intended behavour (rather the current behaviour is an unintended consequence of the functionality described in the documentation).

James Youngman <jay>
Project Administrator
Fri 10 Feb 2017 07:21:30 PM UTC, comment #2:

> If the file's name contains no slashes (for example because it was named on the command line and is in the current working directory), then “%h” expands to “.”. This prevents “%h/%f” expanding to “/foo”, which would be surprising and probably not desirable.


This looks to me like the intention was for "%h/%f" to be a valid path to the file (otherwise, why have the special case at all?).

But I realise that it does exactly document the current behaviour. Consider this a feature request then?

Tavian Barnes <tavianator>
Fri 10 Feb 2017 05:05:07 PM UTC, comment #1:

The behaviour might be strange, but it's documented and explained:

https://www.gnu.org/software/findutils/manual/html_mono/find.html#Name-Directives

James Youngman <jay>
Project Administrator
Thu 09 Feb 2017 01:12:01 AM UTC, original submission:

If the root path has a trailing slash, %h doesn't replace it with '.', resulting in this strange behaviour:

$ mkdir -p foo/bar
$ find foo -printf '%h/%f\n'
./foo
foo/bar
$ find foo/ -printf '%h/%f\n'
foo/foo/
foo/bar

Tavian Barnes <tavianator>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach File(s):
   
   
Comment:
   

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by ericb (Posted a comment)
  • -unavailable- added by berny (Updated the item)
  • -unavailable- added by jay (Posted a comment)
  • -unavailable- added by tavianator (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    Follow 4 latest changes.

    Date Changed By Updated Field Previous Value => Replaced By
    Mon 20 Feb 2017 05:57:39 PM UTCbernyStatusNone=>Fixed
    Fri 17 Feb 2017 12:46:46 AM UTCbernyAttached File-=>Added 0001-find-fix-printf-h-for-arguments-with-a-trailing-slas.v2.patch, #39769
    Sun 12 Feb 2017 01:15:42 PM UTCbernyAttached File-=>Added 0001-find-fix-printf-h-for-arguments-with-a-trailing-slas.patch, #39733
      Assigned toNone=>berny

    Back to the top


    Powered by Savane 3.1-cleanup1