[Toybox] find applet arguments, quotations and wildcards
Robert Thompson
robertt.thompson at gmail.com
Wed Feb 7 20:23:19 PST 2018
This is because the wildcard argument to -iname needs *not* to be
expanded by the shell. It needs to be passed to find as a literal
unexpanded string still containing wildcards. Usually this means
single-quoting.
for example,
find . -iname '*data'
The -iname takes a single argument, and if the *shell* expands the
wildcard, the arguments find sees will be out of sync with
expectations, resulting in an unexpected argument, or even unintended
side effects, if the wildcard matched a file named '-delete' or
something...
one easy way of debugging this general kind of error is to add echo to
the front of your commandline, so you can see the results.
find . -iname '*.foo'
becomes
echo find . -iname '*.foo'
if it prints
find . -iname *.foo
everything is good. If it prints
find . -iname a.foo b.foo c.foo
you have a problem. In most cases double quotes are okay, but single
quotes are safe.
Imagine someone really hates you and creates a filename that is
literally $( rm -rf ${HOME} ) or something similar. doublequoted, the
shell will still execute the rm so that it can expand the $( )
variable with the stdout of the rm. Singlequoted, no expansion occurs.
On 2/7/18, darken <darken at darken.eu> wrote:
> I just noticed the following find applet behavior with regards to
> wildcards.
> I don't think it's a bug as it shows in all find applets, but I'm puzzled
> by what is happening.
>
> It seems that when using wildcards and the search results contain a
> wildcard match that contains a dash, then find uses the result as argument
> option? Why?
>
> ~Matthias
>
> ```
> sailfish:/sdcard $ find --version
> toybox 0.7.4-android
> sailfish:/sdcard $ find . -iname *data
> find: bad arg 'sleep-data'
> 1|sailfish:/sdcard $ find . -iname "*data"
> ./Android/data
> ./data
> ./sleep-data
> ./Documents/sleep-data
> sailfish:/storage/emulated/0 # find . -iname *droid
> ./Android
>
>
> sailfish:/storage/emulated/0 # /data/local/tmp/busybox-armv6l find . -iname
> *data
> find: unrecognized: sleep-data
> BusyBox v1.26.2 (2017-01-11 08:43:16 UTC) multi-call binary.
>
>
> darken at greendns:~/test$ find --version
> find (GNU findutils) 4.7.0-git
> darken at greendns:~/test$ mkdir -p Android/data
> darken at greendns:~/test$ mkdir data
> darken at greendns:~/test$ mkdir sleep-data
> darken at greendns:~/test$ mkdir -p Documents/sleep-data
> darken at greendns:~/test$ find . -iname *data
> find: paths must precede expression: sleep-data
> ```
>
More information about the Toybox
mailing list