如何递归地从文件中删除执行权限而不接触文件夹?


40

我备份了一个NTFS驱动器,事实证明,这种备份确实很有必要。但是,NTFS驱动器弄乱了权限。我想将它们恢复为正常,而无需手动修复每个文件。

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

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

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

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


1
Meta:我从未理解过为什么Unix系统将执行位添加到从DOS或Windows文件系统挂载的文件中。这与任何人都不会执行那些文件不同。我通常在可行的情况下在安装选项中添加“ noexec”。
爱德华·福尔克

Answers:


68
chmod -R -x+X *

-x删除所有用户
的执行权限。+X将添加所有用户的执行权限,但适用于目录。


2
我最终用来恢复正常权限的命令:“ chmod -R a-x + X,u-x + rwX,go-wx + rX目录/名称”
gaazkam,2016年

3
另请参阅
Edwards

4
这不能满足“不碰文件夹”的要求。如果在某些目录中有意删除了execute(也许是world)怎么办?您不应该添加它。
Ben Voigt

4
这在Mac上不起作用。将-R标志移到开头将使它在linux和Mac终端中都能正常工作。chmod -R -x+x *
JoeMoe1984 '17

2
实际上,它以正确的顺序运行在OSX上,但实际上并没有达到预期的效果。您必须将其作为两个独立的步骤进行:chmod -R -x * && chmod -R +X *
Timmmm '18

14

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

  • 通用格式为子句 [,子句 …],其中:
  • 子句:= [ugoa] [+-=] [rwxXstugo]
  • [ugoa]()(指定多个)表示为用户,组,其他或全部设置权限。如果未指定,则默认值为'a',但umask有效。
  • [+-=](动作)(指定一个)表示:
    • +表示将指定的权限添加到已经生效的权限中
    • -表示从已经生效的权限中删除指定的权限
    • =表示将权限设置为指定的权限,清除所有其他权限
  • [rwxXstugo](权限)(指定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

请注意,目录和“ 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变体上进行测试。


很高兴读。感谢您对此进行研究。
Jak Gibb

10

一种方法:

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

6
这样可能最终会添加或删除您不想更改的权限。更好地使用chmod a-x {}
Edward Falk 2016年

1
@EdwardFalk chmod a-x {}最终也可能会删除您不想更改的权限,这可能会使文件在世界范围内可写。关键是,0644是“通常合理的”折衷方案。当然,在他的计算机上应用Internet解决方案之前,OP还应该吸引大脑。

4
据我所知,“ ax”删除了用户,组,其他用户的执行权限,并使其他权限保持不变。我有错吗?
爱德华·福尔克

1
@EdwardFalk不,你是对的。但是您不知道文件的真正含义,也不知道以前的权限chmod是什么。如果备份文件包含脚本和二进制文件,x则从它们中删除是错误的。如果之前的权限chmod为0777,则chmod a-x仍将其保留为0666,这可能不是您想要的。我的意思是说,这chmod 0644是更好的启发法,不是chmod a-x错。
佐藤桂

1
@NajibIdrissi除了将它们复制到没有UNIX权限的外部文件系统上时,它们变为0777的情况不同。OP正是这么做的。
佐藤桂

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

将删除对不是目录类型(根据您的请求)或符号链接的文件的执行许可(符号链接通常始终为rwxrwxrwx,并且chmod会影响它们上的符号链接的目标)。

注意:

 find backup -type f -exec chmod a-x {} +

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


2

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

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

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

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
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.