如何从文件(而非目录)中递归删除可执行位


Answers:


132

使用GNU chmod(在Ubuntu上)单个命令变体(从当前目录开始):

chmod -R -x+X .

说明:

  • -R -递归操作
  • -x -删除所有用户的可执行标志
  • +X -如果是目录,则为所有用户设置可执行标志

在这种情况下,大写字母X仅适用于目录,因为所有可执行标志都已用清除-x。否则,+X如果最初为用户,组或其他用户设置了标志,则还要设置可执行标志。

使用BSD chmod(Mac OS X中提供),您必须通过两个命令分别进行操作:

sudo chmod -R -x * && sudo chmod -R +X *

(如果还要在主目录中包含隐藏文件,则可能需要将*更改为。(点),但未经测试。)


在Ubuntu 13.04上,需要进行一些细微调整:chmod -R a-x+X *
Eero Aaltonen

@EeroAaltonen:谢谢你的来信。如果您umask不允许x所有人使用,可能会发生这种情况。您使用默认umask还是更改了默认设置?您能发送umask命令输出吗?除了您的解决方案之外,还有这种可能性:chmod -R a-x,+X *它将x根据您的设置权限umask。我将更新答案,但我想首先检查BSD / Mac OS X中的行为。
pabouk

@pabouk oopsie!它实际上是CentOS的框,我有我的umask设置为0007
艾罗Aaltonen

这只是悲伤... :(我喜欢find在下面结合简单的工具,一件事做好,它的风格答案变种。
mikezter

2
如果您不希望将其应用于所有文件,请使用.代替*
John Magnolia

46

如果您首先进入正确的路径:

find . -type f -exec chmod -x {} \;

要么

chmod -x $(find . -type f)

查找在路径中找到所有类型为'f'的文件(即常规文件)。然后在每个文件上调用chmod -x。{}代替文件名和\; 终止chmod命令。


6
如果您find支持,请使用-exec ... \+代替-exec ... \;-它需要更少的fork+ execs。如果不是,请使用find ... -print0 | xargs -0 ...
短暂的2012年

5
我曾经使用过这种技术,但是在发现中添加了“ -perm +111”,因此只有chmod的x位已设置:find . -type f -perm +111 -exec chmod -x {} \;
chris13年

4
+1 @Matthijs之所以比pabouk的解决方案好,是因为该命令只保留目录,而pabouk则将所有目录中的可执行位重新设置。可能有一些目录的可执行位未设置,而pabouk的命令对其进行了设置,而有些目录可能希望保留它们不变。
MariusMatutiae,

对于包含空格的路径,第二种方法将失败。
MestreLion

@ephemient:如果您有find支持,-print0我很确定它也将支持-exec
MestreLion 2015年

3

在终端窗口中的Linux和Unix下,或在Mac OS X上,在Terminal.app中使用它:

find . -type f -print0 | xargs -0 chmod -x

1
从本质上讲,这与Matthijs P从2011
以来

你还记得这个命令行吗?我不能
Mike L.

请参阅Matthijs答案下方的ephemient评论,以了解此答案为何有用。
PatrickT

2

这种chmod -x+X方法在ubuntu上也不适合我,因此我写了这个最小的python脚本:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

如果文件系统中可能有一些多余的东西(例如套接字),那么您可能希望用try / catch包围最后一个chmod。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.