如何在不接触文件夹的情况下递归地删除文件的执行权限?

如何在不接触文件夹的情况下递归地删除文件的执行权限?

我对 NTFS 驱动器进行了备份,事实证明这个备份确实是必要的。然而,NTFS 驱动器的权限混乱。我想将它们恢复到正常状态,无需手动修复每个文件。

一个问题是我的所有文本文件突然都获得了执行权限,这是错误的。所以我尝试:

sudo chmod -R a-x folder\ with\ restored\ backup/

但这是错误的,因为它x也删除了目录的权限,这使得它们不可读。

在这种情况下正确的命令是什么?

答案1

如果您愿意为所有文件夹上的每个人设置执行权限:

chmod -R -x+X -- 'folder with restored backup'

删除-x所有的执行权限
将为+X所有添加执行权限,但是仅有的对于目录。

斯特凡·查泽拉斯的回答根据要求,寻找一种真正不接触文件夹的解决方案find

答案2

好吧,我重新阅读了 Mac OS X、BSD 和 Linux 的“chmod”手册页,并做了一些实验。这是我对符号模式的了解。它可能会变得复杂,但值得理解:

  • 一般形式是条款[,条款…] 在哪里:
  • 条款:= [ugoa][+-=][rwxXstugo]
  • [乌戈亚](WHO)(指定多个)表示为用户、组、其他或全部设置权限。如果未指定,则默认为“a”,但umask已生效。
  • [+-=](行动)(指定一项)是指:
    • + 表示将指定的权限添加到已经生效的权限中
    • - 表示从已经生效的权限中删除指定的权限
    • = 表示将权限设置为指定权限,清除所有其他权限
  • [rwxXstugo](允许)(指定 rwxXst 的倍数或 ugo 之一)设置指定用户的权限,如下所示:
    • r——读
    • w——写
    • x — 执行/搜索
    • X — 执行/搜索当且仅当目录或任何执行位已设置。
    • s — suid 或 sgid
    • t—
    • u — 复制用户权限
    • g — 复制组权限
    • o — 复制其他权限

例如,a+x将使每个人都可执行文件。a+X如果某个文件可以被任何人执行,那么它就可以被每个人执行。

a+x将使每个人都可以搜索目录。a+X还将创建一个每个人都可以搜索的目录。

BSD 和 Linux 之间的主要区别在于,BSD 是根据文件的权限做出决定的chmod 被执行。而在 Linux 中,确定是在执行 +X 子句之前立即做出的。

因此,对于 BSD,该组合a-x,a+X将删除执行/搜索权限,然后使每个人都可以搜索目录,并使每个人都可以执行文件如果它最初是任何人都可以执行的。

对于 Linux,a-x,a+X将删除执行/搜索权限,然后使每个人都可以搜索目录,同时留下任何人都可执行的文件。


下面是一个具体的例子:在 BSD 机器上:一个目录、一个可执行文件和一个不可执行文件:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

请注意,目录和“fie”均可由用户执行/搜索,但其他人则不可执行/搜索。

现在我们执行chmod a-x,a+X *.第一个子句将从所有用户的所有文件中删除执行/搜索位,但第二个子句将为“fee”和“fie”将其添加回来。 “fee”是因为它是一个目录,“fie”是因为它至少有一个可执行位开始。

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

我执行时得到了相同的结果chmod -x+X

结论:Jak Gibb 的解决方案适用于 Linux,但对于 BSD,您需要进行两次传递。

我没有在 SVr4 或其他 Unix 变体上对此进行测试。

答案3

一种方法是:

find backup -type f -exec chmod 0644 {} +

答案4

在 zsh 中,使用全局限定符 .仅匹配常规文件(不包括符号链接)并D匹配点文件:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

如果命令行太长,可以使用zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 

相关内容