Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I need to strip the executable flag from all files within a certain directory and sub directories. Right now I'm doing it with a 2 step process

find /dir/ -type f -exec chmod ugo-x {} \;
find /dir/ -type d -exec chmod ugo+rx {} \;

Is it possible to modify the first line so that I can strip exec flag from all non-directory files? Since this needs to be done on a fairly regular basis across a lot of directories and files, I'd prefer not to use a bash script which would slow it down.

share|improve this question
Out of curiosity, what exactly doesn't your current command do properly? The -type f predicate already selects all files (or equivalently, all non-directory files, since anything that is a file cannot also be a directory). – David Z Sep 26 '10 at 8:56
@David: Sockets, FIFOs, symlinks, devices, etc. – Ignacio Vazquez-Abrams Sep 26 '10 at 9:09
@Ignacio: Yes, but the question was about files, not all those other non-file things. – David Z Sep 26 '10 at 9:26
@David: This is *nix. Everything is a file. – Ignacio Vazquez-Abrams Sep 26 '10 at 9:29
@Ignacio: Everything has a filesystem path, sure, but you can't always say that everything is actually a file. Some people do, but others use "file" in the sense of a regular file, i.e. something that would be matched by the -type f predicate to find. To me, the wording of this question strongly suggested the latter meaning. – David Z Sep 27 '10 at 4:15
up vote 4 down vote accepted
find ... '!' -type d ...
share|improve this answer
Thanks, I didn't realize find had operators. Are the single quotes necessary as I managed to get it to work without them? – wting Sep 26 '10 at 8:31
It depends on your shell and its options. bash uses ! in history expansion, so quoting it in the CLI is a good idea. You probably won't need it in a script though. – Ignacio Vazquez-Abrams Sep 26 '10 at 9:08
History expansion is not active in scripts, correct. – Daenyth Sep 26 '10 at 13:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .