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

Mik*_* L. 91 chmod

当我将 U 盘 (FAT) 插入 Mac 或 Ubuntu 机器时,所有文件都设置了可执行位。将目录结构复制到硬盘后,如何仅从文件中递归删除可执行位并将其保留在目录中?

pab*_*ouk 153

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

chmod -R -x+X .
Run Code Online (Sandbox Code Playgroud)

解释:

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

在这种情况下,大写X仅适用于目录,因为所有可执行标志都被-x. 否则,+X如果最初为任何用户、组或其他人设置了标志,则也设置可执行标志。

使用 BSD chmod(存在于 Mac OS X 上),您必须在两个命令中分别执行:

sudo chmod -R -x * && sudo chmod -R +X *
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您希望将其应用于所有文件,请使用 `.` 而不是 `*` (3认同)
  • 在 Ubuntu 13.04 上需要做一个小调整:`chmod -R a-x+X *` (2认同)

Mat*_*s P 46

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

find . -type f -exec chmod -x {} \;
Run Code Online (Sandbox Code Playgroud)

或者

chmod -x $(find . -type f)
Run Code Online (Sandbox Code Playgroud)

find 在 path 中查找所有类型为“f”(表示常规文件)的文件。然后在每个文件上调用 chmod -x 。{} 被替换为文件名和 \; 终止 chmod 命令。

  • 如果您的 `find` 支持它,请使用 `-exec ... \+` 而不是 `-exec ... \;` - 它需要更少的 `fork`+`exec`s。如果没有,请使用`find ... -print0 | xargs -0 ...`。 (6认同)
  • 我已经使用了这种技术,但是在 find 中添加了“-perm +111”,因此它只有 chmod 设置了 x 位的那些:`find 。-type f -perm +111 -exec chmod -x {} \;` (5认同)
  • +1 @Matthijs 这比 pabouk 的解决方案更好的原因是该命令单独保留目录,而 pabouk 重新设置所有目录中的可执行位。可能有一些目录没有设置可执行位,pabouk 的命令设置了它,而人们可能希望将它们保持原样。 (4认同)