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

gaa*_*kam 71 permissions executable recursive

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

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

sudo chmod -R a-x folder\ with\ restored\ backup/
Run Code Online (Sandbox Code Playgroud)

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

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

小智 94

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

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

-x移除了执行所有权限
+X将增加执行的所有权限,但对目录。

请参阅下面的解决方案,该解决方案find用于真正不按要求触摸文件夹。

  • 这不符合“不接触文件夹”的要求。如果在某些目录上有意删除了执行(也许是全局)怎么办?你不应该添加它。 (4认同)
  • 这在 Mac 上不起作用。将 -R 标志移到开头将使这项工作在 linux 和 Mac 终端中都能正常工作。`chmod -R -x+x *` (4认同)
  • 另请参阅 [Edward 的回答](http://unix.stackexchange.com/a/297014/111262) 关于 BSD 的异常 (3认同)
  • 我最终用来恢复正常权限的命令:`chmod -R a-x+X,u-x+rwX,go-wx+rX directory/name\` (2认同)
  • 实际上,它以正确的顺序在 OSX 上运行,但实际上并没有达到预期的效果。您必须将其分为两个单独的步骤:`chmod -R -x * && chmod -R +X *` (2认同)
  • 并且您必须以 `sudo` 运行,否则 `+X` 无权递归到子目录中。 (2认同)

Edw*_*alk 18

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

  • 一般形式是子句[,子句…] 其中:
  • 条款:= [ugoa][+-=][rwxXstugo]
  • [ugoa] ( who ) (指定多个) 表示为用户、组、其他或全部设置权限。如果未指定,则默认值为 'a',但umask有效。
  • [+-=] ( action ) (指定一个) 表示:
    • + 表示将指定的权限添加到已经生效的权限中
    • - 表示从已经生效的权限中删除指定的权限
    • = 表示将权限设置为指定的权限,清除所有其他权限
  • [rwxXstugo] ( permission )(指定 rwxXst 的倍数或 ugo 之一)为指定用户设置权限,如下所示:
    • r——读
    • w——写
    • x — 执行/搜索
    • X — 执行/搜索 iff 目录或已设置任何执行位。
    • 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
Run Code Online (Sandbox Code Playgroud)

观察目录和“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
Run Code Online (Sandbox Code Playgroud)

我有同样的结果执行chmod -x+X

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

我没有在 SVr4 或其他 Unix 变体上测试这个。


Sat*_*ura 13

一种方法:

find backup -type f -exec chmod 0644 {} +
Run Code Online (Sandbox Code Playgroud)

  • 这可能会导致添加或删除您不想更改的权限。最好使用`chmod ax {}` (7认同)
  • 据我所知,“ax”删除了用户、组、其他的执行权限,并保持其他权限不变。我有错吗? (4认同)
  • @EdwardFalk `chmod ax {}` 也可能最终删除您不想更改的权限,并且它可能使文件成为可写的。关键是,0644 是一个“普遍合理”的妥协。当然,在将 Internet 上的解决方案应用到他的计算机上之前,OP 也应该动脑筋。 (2认同)
  • 该问题具体询问如何删除所有文件的执行权限,仅此而已。`chmod ax` 可以做到这一点,`chmod 0644` 可以做其他事情。第 777 章 (2认同)

Sté*_*las 10

 find backup ! -type l ! -type d -exec chmod a-x {} +
Run Code Online (Sandbox Code Playgroud)

将删除对目录类型(如您所要求的)和符号链接(符号链接通常总是 rwxrwxrwx,并且chmod会影响符号链接的目标)的文件的执行权限。

注意:

 find backup -type f -exec chmod a-x {} +
Run Code Online (Sandbox Code Playgroud)

只会更改常规文件的权限。这将排除目录符号链接,但也排除设备命名管道套接字和其他可能取决于系统的内容(尽管在 OP 备份 NTFS 文件系统的情况下,这些不太可能存在)。