* bug#27456: 25.2; Not possible to use -prune with find-dired
@ 2017-06-23 6:00 Allen Li
2017-07-12 19:40 ` Michael Heerdegen
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Allen Li @ 2017-06-23 6:00 UTC (permalink / raw)
To: 27456
It is not possible to effectively use the -prune action with find-dired.
With plain find, -prune would be used like:
find . -name "foo*" -prune -o -name "*.el" -ls
However, find-dired wraps everything:
(find-dired "." "-name \\"foo*\\" -prune -o -name \\"*.el\\" -ls")
results in the equivalent call:
find . \( -name "foo*" -prune -o -name "*.el" -ls \) -ls
Notably, this will list files matching foo*
Unfortunately, I'm not sure if there are any easy remedies. Perhaps
find-dired should refrain from appending -ls if ARGS already contains
-ls.
In GNU Emacs 25.2.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.22.10)
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2017-06-23 6:00 bug#27456: 25.2; Not possible to use -prune with find-dired Allen Li
@ 2017-07-12 19:40 ` Michael Heerdegen
2017-07-13 6:56 ` Allen Li
2017-07-13 7:32 ` Andreas Schwab
2018-09-09 0:35 ` Allen Li
2 siblings, 1 reply; 12+ messages in thread
From: Michael Heerdegen @ 2017-07-12 19:40 UTC (permalink / raw)
To: Allen Li; +Cc: 27456
Hi Allen,
> It is not possible to effectively use the -prune action with
> find-dired.
I think I can use it successfully.
> With plain find, -prune would be used like:
>
> find . -name "foo*" -prune -o -name "*.el" -ls
>
> However, find-dired wraps everything:
>
> (find-dired "." "-name \\"foo*\\" -prune -o -name \\"*.el\\" -ls")
I get an error when I try to eval this. I think the backslashes should
not be doubled.
> results in the equivalent call:
>
> find . \( -name "foo*" -prune -o -name "*.el" -ls \) -ls
>
> Notably, this will list files matching foo*
Can't you just leave out the explicit -ls in the arguments?
Also, AFAIK "-prune" is about descending into directories, not about
file names.
Michael.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2017-07-12 19:40 ` Michael Heerdegen
@ 2017-07-13 6:56 ` Allen Li
2017-07-19 0:21 ` Michael Heerdegen
0 siblings, 1 reply; 12+ messages in thread
From: Allen Li @ 2017-07-13 6:56 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 27456
On Wed, Jul 12, 2017 at 12:40 PM, Michael Heerdegen
<michael_heerdegen@web.de> wrote:
> Hi Allen,
>
>> It is not possible to effectively use the -prune action with
>> find-dired.
>
> I think I can use it successfully.
>
>> With plain find, -prune would be used like:
>>
>> find . -name "foo*" -prune -o -name "*.el" -ls
>>
>> However, find-dired wraps everything:
>>
>> (find-dired "." "-name \\"foo*\\" -prune -o -name \\"*.el\\" -ls")
>
> I get an error when I try to eval this. I think the backslashes should
> not be doubled.
You're right, I copied the string from a context that required them to
be escaped twice.
>
>> results in the equivalent call:
>>
>> find . \( -name "foo*" -prune -o -name "*.el" -ls \) -ls
>>
>> Notably, this will list files matching foo*
>
> Can't you just leave out the explicit -ls in the arguments?
Nope, find-dired adds it automatically.
Try evaluating: (find-dired "~/.emacs.d" "-name \"elpa\" -prune -o
-name \"*.el\" -ls")
This translates into: find . \( -name "elpa" -prune -o -name "*.el" -ls \) -ls
This includes the elpa directory, which is not desired (this also
prints all .el files twice due to the doubled -ls, see below).
Next try running in a shell: find . -name "elpa" -prune -o -name "*.el" -ls
Notice how the former includes the elpa directory and the latter does not.
PS Upon closer reading, it sounds like you're suggesting to do
(find-dired "~/.emacs.d" "-name \"elpa\" -prune -o -name \"*.el\" ")
This translates into: find . \( -name "elpa" -prune -o -name "*.el" \) -ls
This still includes the elpa directory which is undesired.
>
> Also, AFAIK "-prune" is about descending into directories, not about
> file names.
Directories are files; in particular, they also have file names.
Sorry, I'm not sure what you're trying to say
PPS In a sudden flash of insight, I thought of using (find-dired
"~/.emacs.d" "-name \"elpa\" -prune -false -o -name \"*.el\"")
This works for my example use case.
Since I have found a workaround for my use case, I am okay with this
being closed now, but I feel like there may be more complex find
commands that I may want to do in the future where this either does
not work or introduces a lot more complexity, in which case I (or
someone else) will have to reopen this bug or create a new one. I
think it would be valuable for someone experienced with find to chime
in, but I think that perhaps find-dired shouldn't always construct a
command like "find \( <args> \) -ls"
>
>
> Michael.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2017-06-23 6:00 bug#27456: 25.2; Not possible to use -prune with find-dired Allen Li
2017-07-12 19:40 ` Michael Heerdegen
@ 2017-07-13 7:32 ` Andreas Schwab
2018-09-09 0:35 ` Allen Li
2 siblings, 0 replies; 12+ messages in thread
From: Andreas Schwab @ 2017-07-13 7:32 UTC (permalink / raw)
To: Allen Li; +Cc: 27456
On Jun 22 2017, Allen Li <darkfeline@felesatra.moe> wrote:
> It is not possible to effectively use the -prune action with find-dired.
>
> With plain find, -prune would be used like:
>
> find . -name "foo*" -prune -o -name "*.el" -ls
You can use the comma operator instead of -o, so that the left operand
is only evaluated for its side effect (of -prune).
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2017-07-13 6:56 ` Allen Li
@ 2017-07-19 0:21 ` Michael Heerdegen
0 siblings, 0 replies; 12+ messages in thread
From: Michael Heerdegen @ 2017-07-19 0:21 UTC (permalink / raw)
To: Allen Li; +Cc: 27456
Allen Li <vianchielfaura@gmail.com> writes:
> PS Upon closer reading, it sounds like you're suggesting to do
> (find-dired "~/.emacs.d" "-name \"elpa\" -prune -o -name \"*.el\" ")
Yes, that's what I meant. Don't specify "-ls" yourself.
> PPS In a sudden flash of insight, I thought of using (find-dired
> "~/.emacs.d" "-name \"elpa\" -prune -false -o -name \"*.el\"")
I think this is the canonical solution for your use case. "-prune"
doesn't fail, so you need to add "-false" for the directory itself to be
left out.
> Since I have found a workaround for my use case, I am okay with this
> being closed now, but I feel like there may be more complex find
> commands that I may want to do in the future where this either does
> not work or introduces a lot more complexity, in which case I (or
> someone else) will have to reopen this bug or create a new one. I
> think it would be valuable for someone experienced with find to chime
> in, but I think that perhaps find-dired shouldn't always construct a
> command like "find \( <args> \) -ls"
I doubt that it is really a big problem in practice, but I don't close
the bug for now, not being an expert on "find" myself.
Thanks,
Michael.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2017-06-23 6:00 bug#27456: 25.2; Not possible to use -prune with find-dired Allen Li
2017-07-12 19:40 ` Michael Heerdegen
2017-07-13 7:32 ` Andreas Schwab
@ 2018-09-09 0:35 ` Allen Li
2018-09-09 2:39 ` Michael Heerdegen
2 siblings, 1 reply; 12+ messages in thread
From: Allen Li @ 2018-09-09 0:35 UTC (permalink / raw)
To: 27456
I think we can close this. The comma operator suggested by Andreas is
the right solution.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2018-09-09 0:35 ` Allen Li
@ 2018-09-09 2:39 ` Michael Heerdegen
2018-09-09 5:22 ` Phil Sainty
0 siblings, 1 reply; 12+ messages in thread
From: Michael Heerdegen @ 2018-09-09 2:39 UTC (permalink / raw)
To: Allen Li; +Cc: 27456-done
Allen Li <darkfeline@felesatra.moe> writes:
> I think we can close this. The comma operator suggested by Andreas is
> the right solution.
Ok, fine - closing.
Michael.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2018-09-09 2:39 ` Michael Heerdegen
@ 2018-09-09 5:22 ` Phil Sainty
2018-09-09 5:32 ` Michael Heerdegen
0 siblings, 1 reply; 12+ messages in thread
From: Phil Sainty @ 2018-09-09 5:22 UTC (permalink / raw)
To: 27456, michael_heerdegen, darkfeline
The two workarounds indicated here do work nicely.
For reference, to list everything except a certain directory
(.git, in this example), you could use either of the following
option sets at the "Run find (with args):" prompt:
-type d -name .git -prune , -true
-type d -name .git -prune -false -o -true
Despite that, I think it would be useful and consistent for
`find-dired' to acquire the prefix argument behaviour of `rgrep':
> With C-u prefix, you can edit the constructed shell command line
> before it is executed.
> With two C-u prefixes, directly edit and run `grep-find-command'.
This would give some users a more familiar solution to the problem
if they are not used to the particular find options needed to work
around the problem (which was the situation I found myself in just
the other day, so the new activity on this bug was very timely :)
-Phil
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2018-09-09 5:22 ` Phil Sainty
@ 2018-09-09 5:32 ` Michael Heerdegen
2018-09-09 9:38 ` Phil Sainty
0 siblings, 1 reply; 12+ messages in thread
From: Michael Heerdegen @ 2018-09-09 5:32 UTC (permalink / raw)
To: Phil Sainty; +Cc: 27456, darkfeline
Phil Sainty <psainty@orcon.net.nz> writes:
> Despite that, I think it would be useful and consistent for
> `find-dired' to acquire the prefix argument behaviour of `rgrep':
>
> > With C-u prefix, you can edit the constructed shell command line
> > before it is executed.
> > With two C-u prefixes, directly edit and run `grep-find-command'.
>
> This would give some users a more familiar solution to the problem
> if they are not used to the particular find options needed to work
> around the problem (which was the situation I found myself in just
> the other day, so the new activity on this bug was very timely :)
Yes, that could be useful. Do you want to provide a patch, or can you
open a new bug report with the feature request?
Thanks,
Michael.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2018-09-09 5:32 ` Michael Heerdegen
@ 2018-09-09 9:38 ` Phil Sainty
2018-09-09 11:49 ` Phil Sainty
2018-09-09 14:04 ` bug#32668: " Drew Adams
0 siblings, 2 replies; 12+ messages in thread
From: Phil Sainty @ 2018-09-09 9:38 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 27456, darkfeline
On 09/09/18 17:32, Michael Heerdegen wrote:
> Yes, that could be useful. Do you want to provide a patch, or can you
> open a new bug report with the feature request?
For now I have raised this as bug#32668: 26.1; Give find-dired prefix
argument behaviour equivalent to that of rgrep
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#27456: 25.2; Not possible to use -prune with find-dired
2018-09-09 9:38 ` Phil Sainty
@ 2018-09-09 11:49 ` Phil Sainty
2018-09-09 14:04 ` bug#32668: " Drew Adams
1 sibling, 0 replies; 12+ messages in thread
From: Phil Sainty @ 2018-09-09 11:49 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 27456, darkfeline
What do people think about mentioning in the `find-dired' docstring
the -true, -false, and comma operators, as being particularly useful
for structuring a find command within the constraints applied by
this function? Maybe even including a usage example for -prune?
-Phil
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#32668: bug#27456: 25.2; Not possible to use -prune with find-dired
2018-09-09 9:38 ` Phil Sainty
2018-09-09 11:49 ` Phil Sainty
@ 2018-09-09 14:04 ` Drew Adams
1 sibling, 0 replies; 12+ messages in thread
From: Drew Adams @ 2018-09-09 14:04 UTC (permalink / raw)
To: Phil Sainty, Michael Heerdegen; +Cc: 27456, 32668, darkfeline
> For now I have raised this as bug#32668: 26.1; Give find-dired prefix
> argument behaviour equivalent to that of rgrep
FWIW, in my library `find-dired+.el', which adds to `find-dired.el',
`find-dired' acts as follows (`C-h f find-dired'):
------8<---------------
find-dired is an interactive Lisp function in ‘find-dired+.el’.
(find-dired DIR ARGS &optional DEPTH-LIMITS EXCLUDED-PATHS)
Run ‘find’ and put its output in a buffer in Dired Mode.
Then run ‘find-dired-hook’ and ‘dired-after-readin-hook’.
The ‘find’ command run (after changing into DIR) is essentially this,
where LS-SWITCHES is ‘(car find-ls-option)’:
find . \( ARGS \) LS-SWITCHES
Optional args:
* DEPTH-LIMITS: Minimum and maximum depths: (MIN-DEPTH MAX-DEPTH).
* EXCLUDED-PATHS: Strings matching paths to be excluded.
Uses ‘find’ switch ‘-path’.
When both optional args are non-nil, the ‘find’ command run is this:
find . -mindepth MIN-DEPTH -maxdepth MAX-DEPTH
\( -path EXCLUDE1 -o -path EXCLUDE2 ... \)
-prune -o \( ARGS \) LS-SWITCHES
where EXCLUDE1, EXCLUDE2... are the EXCLUDED-PATHS, but shell-quoted.
------8<---------------
The same is true for `find-name-dired' and `find-grep-dired' - they make the same use of `-prune', as does the new command `find-time-dired' (`C-h f'):
------8<---------------
find-time-dired is an interactive Lisp function in ‘find-dired+.el’.
(find-time-dired DIR MIN-TIME MAX-TIME &optional DEPTH-LIMITS
EXCLUDED-PATHS)
Find files in directory DIR newer or older than a timestamp.
The output is shown in a Dired buffer.
MIN-TIME is a format-time string parsable by ‘parse-time-string’, such
as "2014-12-25 23:59:00". Only files newer than this are shown.
If MIN-TIME is nil or a string matching regexp "^\s-*$", there is
no lower time limit.
MAX-TIME is also a format-time string parsable by ‘parse-time-string’.
Only files older than this time are shown.
If MAX-TIME is nil or a string matching regexp "^\s-*$", the upper
time limit is the current system time.
Optional arg DEPTH-LIMITS is a list (MIN-DEPTH MAX-DEPTH) of the
minimum and maximum depths. If nil, search directory tree under DIR.
Optional arg EXCLUDED-PATHS is a list of strings that match paths to
exclude from the search. If nil, search all directories.
If args DEPTH-LIMITS and EXCLUDED-PATHS are both non-nil then the
command run is essentially the following:
find . -mindepth MIN-DEPTH -maxdepth MAX-DEPTH
\( -path EXCLUDE1 -o -path EXCLUDE2 ... \)
-prune -o \( -TIME-SWITCH -SINCE-MIN -TIME-SWITCH +SINCE-MAX \)
LS-SWITCHES
where:
* EXCLUDE1, EXCLUDE2... are the EXCLUDED-PATHS, but shell-quoted.
* TIME-SWITCH is ‘find-diredp-time-prefix’ concatenated with "min".
* SINCE-MIN is the elapsed time since MIN-TIME in minutes.
* SINCE-MAX is the elapsed time since MAX-TIME in minutes.
* LS-SWITCHES is ‘(car find-ls-option)’.
------8<---------------
This code was improved by Tino Calancha. Without having studied
the bug threads of #27456 or #32668, this sounds relevant. If it
helps I can offer this code, as a patch or as is. The code is here:
https://www.emacswiki.org/emacs/download/find-dired%2b.el
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2018-09-09 14:04 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-23 6:00 bug#27456: 25.2; Not possible to use -prune with find-dired Allen Li
2017-07-12 19:40 ` Michael Heerdegen
2017-07-13 6:56 ` Allen Li
2017-07-19 0:21 ` Michael Heerdegen
2017-07-13 7:32 ` Andreas Schwab
2018-09-09 0:35 ` Allen Li
2018-09-09 2:39 ` Michael Heerdegen
2018-09-09 5:22 ` Phil Sainty
2018-09-09 5:32 ` Michael Heerdegen
2018-09-09 9:38 ` Phil Sainty
2018-09-09 11:49 ` Phil Sainty
2018-09-09 14:04 ` bug#32668: " Drew Adams
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).