Kyle <[email protected]> writes:
> I'm having a bit of grief with chmod and am hoping one of you gurus
> will set me straight pls.
You have a problem with argument globbing on Unix, not chmod, which
might explain why you are having trouble finding out what is going
wrong.
> I have a bunch of directories with a bunch of files (pictures) in
> each. I want to set directories to 775 and files to 664.
>
> I can do a chmod -R 775 *. But then if I do a chmod -R 664 *.jpg (and
> repeat for all other extensions), for some reason the chmod doesn't
> work.
Sure it does, but what actually happens is:
1. You enter 'chmod -R 644 *.jpg' into the shell.
2. The shell expands the '*.jpg' part into a list of files matching that
pattern (implicitly in the current directory.)
3. The shell runs 'chmod -R 644 example1.jpg example2.jpg etc.jpg'
4. chmod recurses if any of the arguments are a directory, which none of
them are because only *.jpg files were matched.
So, everything works as designed, but '-R' doesn't do quite what you
thought, and neither does the '*.jpg' argument.
Also, if you quote the glob you *still* don't get what you want, because
chmod (like almost all Unix commands) doesn't do internal globbing, it
expects external globbing, so you would get:
] chmod -R 644 '*.jpg'
chmod: cannot access `*.jpg': No such file or directory
[...]
> What am I missing?
find(1), which is used to locate a list of files matching a given set of
criteria, allowing you to do something like this:
chmod -R 644 `find -name '*.jpg'`
(Note the single-quotes around the glob pattern? Without that the shell
would expand the pattern, which would cause a syntax error for the find
command, and not do what you want.)
There is a limit to the number of arguments you can pass to chmod,
though, so it is generally speaking better to structure that like this:
find -name '*.jpg' | xargs chmod -R 644
That falls apart if any of your filenames have spaces in them, though,
since xargs splits on *any* whitespace; to work around that use:
find -name '*.jpg' -print0 | xargs -0 chmod -R 644
See the manual pages for the fine detail, obviously.
Regards,
Daniel
--
SLUG - Sydney Linux User's Group Mailing List - http://slug.org.au/
Subscription info and FAQs: http://slug.org.au/faq/mailinglists.html