查找当前目录下的所有文件,将它们的权限更改为644。

75

为什么这行不通,我试图将所有文件修改为 644 和所有 -d 修改为 755:

find . -type f -exec chmod 644 {} ;

我收到的错误信息是:找不到“-exec”参数的参数值,谢谢。


9
\; 结束,而不是仅以 ; 结束。 - Michael Berkowski
9
这是因为-exec后面的所有内容都被视为它的参数。如果你只使用分号;,它将被视为终止整个find命令,但你实际上需要终止exec命令,因此必须将分号作为参数字符串的一部分进行转义处理。 - Michael Berkowski
1
@MichaelBerkowski 谢谢您!!! - Nick Rolando
3个回答

180
将管道传输到xargs是一种粗暴的做法,可以在find内部完成。
find . -type d -exec chmod 0755 {} \;
find . -type f -exec chmod 0644 {} \;

您可以通过其他选项来更加控制,例如:

find . -type d -user harry -exec chown daisy {} \;

使用 find 命令你可以完成一些很酷的操作,但也可能会做出危险的事情。看一下 "man find",虽然比较长但值得一读。并且,始终记住:

  • 如果你是 root 用户,它将会成功。
  • 如果你在 root 目录 (/) 下运行命令,你将度过糟糕的一天。
  • 使用 /path/to/directory 可以使操作更加安全,因为你明确指定了 find 命令要执行的目录。

6
为什么 xargs 方法会被认为是“不太好的方法”?它有一个巨大的优点,可以将所有文件作为参数一次性运行 chmod。而“-exec chmod”方法将为每个文件创建一个子进程。 - Déjà vu
5
如果你只想运行一次 chmod 命令,那么将其更改为 find . -type f -exec chmod 0644 {} + 就可以了,这与 xargs 方法基本相同,构建一个命令行。 (上面的 \ 仅用于转义分号。) - johnthacker
快速一行命令:find . -type d -exec chmod 0755 {} \; && find . -type f -exec chmod 0644 {} \; - lucaferrario
2
注意 - xargs 通常比 exec 更优秀。使用 exec,每个输入都会调用一次命令,但是使用 xargs,该命令通常只运行一次。因此,如果您的查找查询返回数千个结果,则 xargs 将快几倍! - MarcoZen

22

一个很好的替代方案是这个:

find . -type f | xargs chmod -v 644

以及对于目录:

find . -type d | xargs chmod -v 755

更明确地说:

find . -type f | xargs -I{} chmod -v 644 {}

如何处理文件名中含有空格的文件?我遇到了错误,因为文件名被空格分隔开来,它试图对每个部分运行chmod命令。 - Lidia
1
@Lidia,尝试在查找命令中添加“-print0”选项,并使用“xargs -0”。 - user88595
@TAllieri 非常感谢。 - Lidia

15
我需要经常使用这个功能,所以我在~/.bashrc文件中创建了一个函数:
chmodf() {
        find $2 -type f -exec chmod $1 {} \;
}
chmodd() {
        find $2 -type d -exec chmod $1 {} \;
}

现在我可以使用这些快捷键:

chmodd 0775 .
chmodf 0664 .

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接