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

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

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

答案1

使用 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 *

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

答案2

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

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

或者

chmod -x $(find . -type f)

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

答案3

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

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

答案4

这种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。

相关内容