On 4 April 2014 01:17, Chris Angelico <ros...@gmail.com> wrote: > > -- Get info on all .pyc files in a directory and all its subdirectories -- > C:\>dir some_directory\*.pyc /s > $ ls -l `find some_directory -name \*.pyc` > > Except that the ls version there can't handle names with spaces in > them, so you need to faff around with null termination and stuff.
Nooo, that stinks! There's no need to abuse 'find' like that, unless the version you have is truly ancient. Null termination is only necessary to pass 'find' results *via the shell*. Instead, ask 'find' to invoke the task itself. The simplest way is: find some_directory -name '*.pyc' -ls 'find' is the tool to use for *finding* things, not 'ls', which is intended for terminal display of directory information. If you require a particular feature of 'ls', or any other command, you can ask 'find' to invoke it directly (not via a shell): find some_directory -name '*.pyc' -exec ls -l {} \; 'Find' is widely under utilised and poorly understood because its command line syntax is extremely confusing compared to other tools, plus its documentation compounds the confusion. For anyone interested, I offer these key insights: Most important to understand is that the -name, -exec and -ls that I used above (for example) are *not* command-line "options". Even though they look like command-line options, they aren't. They are part of an *expression* in 'find' syntax. And the crucial difference is that the expression is order-dependent. So unlike most other commands, it is a mistake to put them in arbitrary order. Also annoyingly, the -exec syntax utilises characters that must be escaped from shell processing. This is more arcane knowledge that just frustrates people when they are in a rush to get something done. In fact, the only command-line *options* that 'find' takes are -H -L -P -D and -O, but these are rarely used. They come *before* the directory name(s). Everything that comes after the directory name is part of a 'find' expression. But, the most confusing thing of all, in the 'find' documentation, expressions are composed of tests, actions, and ... options! These so-called options are expression-options, not command-line-options. No wonder everyone's confused, when one word describes two similar-looking but behaviourally different things! So 'info find' must be read very carefully indeed. But it is worthwhile, because in the model of "do one thing and do it well", 'find' is the tool intended for such tasks, rather than expecting these capabilities to be built into all other command line utilities. I know this is off-topic but because I learn so much from the countless terrific contributions to this list from Chris (and others) with wide expertise, I am motivated to give something back when I can. And given that in the past I spent a little time and effort and eventually understood this, I summarise it here hoping it helps someone else. The unix-style tools are far more capable than the Microsoft shell when used as intended. There is good documentation on find at: http://mywiki.wooledge.org/UsingFind -- https://mail.python.org/mailman/listinfo/python-list