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.

  • 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, 2010 at 8:56
  • @David: Sockets, FIFOs, symlinks, devices, etc. Sep 26, 2010 at 9:09
  • @Ignacio: Yes, but the question was about files, not all those other non-file things.
    – David Z
    Sep 26, 2010 at 9:26
  • @David: This is *nix. Everything is a file. Sep 26, 2010 at 9:29
  • 1
    @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, 2010 at 4:15

1 Answer 1

find ... '!' -type d ...
  • 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, 2010 at 8:31
  • 1
    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. Sep 26, 2010 at 9:08
  • History expansion is not active in scripts, correct.
    – Daenyth
    Sep 26, 2010 at 13:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.