<div dir="auto">One thing to point out which might not be obvious to everyone reading along with this exploration is that none of this matters unless you're doing it often.<div dir="auto"><br></div><div dir="auto">What I mean by that is in the vast majority of cases a computer spends its time waiting for your input and every now and then it will spend a little more effort running a process like we're discussing here. Shaving off a few CPU cycles here and there on a job that runs once a day won't make any difference in the scheme of things and readability, robustness and maintenance are much more important.</div><div dir="auto"><br></div><div dir="auto">Not that this conversation is useless at all, I've had the fun of processing data in the TB range with thousands of files and spending some time thinking about these kinds of issues can make the difference between waiting an hour, or waiting a day for the same answer.</div><div dir="auto"><br></div><div dir="auto">Context is important!<br><br><div data-smartmail="gmail_signature" dir="auto">--<br>finger painting on glass is an inexact art - apologies for any errors in this scra^Hibble<br><br>()/)/)() ..ASCII for Onno..</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 29 July 2022, 12:39 Brad Campbell, <<a href="mailto:brad@fnarfbargle.com">brad@fnarfbargle.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 29/7/22 11:29, Jeremy Kerr wrote:<br>
> Hi Brad,<br>
> <br>
>> root@rpi31:/mnt/backup/work# ls -d ??????-???? | wc -l<br>
>> 439<br>
>><br>
>> root@rpi31:/mnt/backup/work# time ls ??????-????/bkb.rhash.crc32<br>
>><br>
>> real    0m13.161s<br>
>> user    0m0.004s<br>
>> sys     0m0.162s<br>
> <br>
> The 'time' in this case isn't measuring the dentry scan - your shell is<br>
> expanding the '?????-????/' glob, then passing all of those expanded<br>
> filenames to the ls invocation. That operation is happening outside of<br>
> the 'time' measurement.<br>
> <br>
> Since 'ls' is passed those expanded files, all it needs to do is stat<br>
> each one, without the dentry scan.<br>
> <br>
> To compare more directly against the find:<br>
> <br>
>     time /bin/sh -c 'ls ??????-????/bkb.rhash.crc32'<br>
<br>
Indeed, right you are.<br>
<br>
root@rpi31:/mnt/backup/work# time for i in `/bin/sh -c 'ls ??????-????/bkb.rhash.crc32'` ; do j=$(dirname $i) ; echo $j ; done<br>
<br>
real    0m13.062s<br>
user    0m0.017s<br>
sys     0m0.207s<br>
<br>
> the quotes there will prevent the interactive shell (which isn't being<br>
> timed) from performing the glob expansion, and instead we're timing the<br>
> glob in the subshell.<br>
> <br>
> While we're on the topic though:<br>
> <br>
>  From your example of:<br>
> <br>
>    for j in `ls ??????-????/bkb.rhash.crc32 2>/dev/null` ; do j=($dirname $j)<br>
> <br>
> Comparing to your `find ... -printf %h`, I assume this might be a typo of:<br>
> <br>
>    for j in `ls ??????-????/bkb.rhash.crc32 2>/dev/null` ; do j=$(dirname $j)<br>
<br>
Yes, it was. I picked that up early but figured it wasn't worth mentioning.<br>
<br>
> The ls is a bit useless here; it will just stat each .crc32 file<br>
> (twice, after the shell has already done so!) and print out the names<br>
> already provided to it as separate arguments.<br>
> <br>
> If we're trying to avoid filesystem interactions, you could just use<br>
> the result of the shell glob directly:<br>
> <br>
>     for j in ??????-????/bkb.rhash.crc32 ; do j=$(dirname $j)<br>
<br>
root@rpi31:/mnt/backup/work# time for j in ??????-????/bkb.rhash.crc32 ; do j=$(dirname $j); echo $j ; done<br>
<br>
real    0m13.072s<br>
user    0m0.015s<br>
sys     0m0.192s<br>
<br>
> We can also avoid spawning a dirname process for each dir:<br>
> <br>
>     for j in ??????-????/bkb.rhash.crc32 ; do j=${j%/*}<br>
<br>
root@rpi31:/mnt/backup/work# time for j in ??????-????/bkb.rhash.crc32 ; do j=${j%/*} ; echo $j ; done<br>
<br>
real    0m13.163s<br>
user    0m0.012s<br>
sys     0m0.142s<br>
<br>
Much of a muchness and all well within error margins. Still over an order of magnitude faster that find, plus I learned some new tricks.<br>
Thanks!<br>
<br>
Regards,<br>
Brad<br>
-- <br>
An expert is a person who has found out by his own painful<br>
experience all the mistakes that one can make in a very<br>
narrow field. - Niels Bohr<br>
_______________________________________________<br>
PLUG discussion list: <a href="mailto:plug@plug.org.au" target="_blank" rel="noreferrer">plug@plug.org.au</a><br>
<a href="http://lists.plug.org.au/mailman/listinfo/plug" rel="noreferrer noreferrer" target="_blank">http://lists.plug.org.au/mailman/listinfo/plug</a><br>
Committee e-mail: <a href="mailto:committee@plug.org.au" target="_blank" rel="noreferrer">committee@plug.org.au</a><br>
PLUG Membership: <a href="http://www.plug.org.au/membership" rel="noreferrer noreferrer" target="_blank">http://www.plug.org.au/membership</a></blockquote></div>