我认为我在使用 find 方面相当先进,但每次使用它时,我都无法记住关闭 -exec 选项的方法。每次使用它时,我都会花大量时间阅读。我只是没有充分使用它还是对自己期望过高?让我们从一个让我感到沮丧的典型例子开始。
目录结构包含所有不正确权限的文件隐藏文件符号链接等我想将所有权更改为合理的值
find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;
(如果结局是反的,请见谅……我一个小时前看了,还是不确定)
但是由于挂载、符号链接等原因,我害怕运行它。我已经做了 chmod .* 的终极恶作剧,并且之前让它在我身上向上递归。我知道 -xdev 会放弃跨分区,但我不确定位于目录中的文件会发生什么,这些文件是符号链接。
那么如何掌握这种可以杀死关键文件的野兽呢?
更新修剪以下最佳建议并总结:
- 将练习目录链接并安装到其他练习目录。
- 使用 xargs 而不是非直观的 exec 命令。
- 使用 -exec echo {} 来保持理智和安全
- 半冒号是特殊的,你正在转义它,因此转义字符是第一个
- -or 命令可以帮助您组合选择标准。
我对 print0 有点困惑,但 xargs 一直对我试图避免的乍一看不容易理解的做法有点困惑。
好吧,就
-exec
语法而言,您可以像很多人一样放弃并使用xargs
:(或带有空格的文件和其他无意义的安全版本)
或者,为了记住正确使用分号,您需要深入了解的是您正在使用分号来终止正在运行的命令
-exec
,并且您必须转义分号,因为它有特殊的的意思bash
。这就是为什么它是反斜杠分号。您似乎可以{}
替换部分。至于杀死文件等,如果您正在运行像您所说的大而危险的东西,请首先执行以下操作:
并查看结果。这基本上是一个“试运行”,您可以在其中看到如果您允许它会运行的命令。绝对是一个好习惯。不会帮助解决这个
.*
问题,但你知道现在不要这样做。:)我很惊讶没有人提到以下选项:
此语法将在执行命令之前确认命令。如果您希望匹配的文件数量相对较少,则效果最好,因为它会提示每个文件。
一些答案提到
xargs
,但对于 GNU find 这也是不必要的:请注意,+ 通常不需要转义,但无论如何养成这样做的习惯是件好事。
这就是 man 的用途: 很难记住事情,这就是 *nix 命令包含手册页的原因。您可以随时查看手册页的 ACTION 部分以获取有关语法的提示:
man find
. 尽管手册页可能看起来不友好,但一旦您熟练阅读它们,它们就会非常方便。制作前端或包装器: 当我想在 GNU find 方面做得更好时,我为 find 编写了一个GUI 前端,它使用 python、glade 和 pygtk 生成 find 命令。如果想真正了解它,这是一个很好的练习。
有一个练习目录: 最后,我的主目录中总是有一个 'scrap' 目录,用于在诸如 'echo' 之类的东西不能削减它时使用强大的命令。您可以使用 shell 扩展来快速创建一堆文件,例如:
您还可以将查找表达式与“-and”和“-or”运算符结合使用。-and 是隐含的:
是相同的
or 运算符可以将您的 4 个命令列表减少到 2 个:
最后,与 find 无关,但 chown 也可以设置组。因此,处理名称中的空格,我们最终得到:
关闭时我只想使用 ; 就像许多编程语言一样,然后转义它。请记住,这是需要逃避的,它很容易出现在你身上。
根据您使用的 find 版本,有不同的选项可能会对您有所帮助。GNU find 可能是最强大的,这可能会帮助您解决第二个(隐含的)问题
例如——默认行为不是取消引用符号链接,但您可以覆盖它;并且 -mount 选项停止查找跨挂载点
查看本地手册页
对于某些 shell(不是 bash)转义 {} 以获得正确的行为。
find 手册对于掌握 find 很有帮助。
有人会争辩说 xargs 选项比 -exec 选项更快,因为它不会为每个文件执行一次命令,但我不会担心除了需要大量时间的大量作业之外的任何事情。
就个人而言,我通常只运行 find 而没有 exec
确保输出看起来正确,然后在该列表上运行我的命令。
在您执行此类操作之前,请确保您运行此命令的目录与 /usr 或 /etc 不在同一个文件系统中。(否则,如果我在我的主目录中有指向 /etc/passwd 或 /bin/sh 的硬链接,那么你刚刚给了我这些的所有权,作为副作用,我现在拥有这台机器)。
如果你想通过一个目录递归并chown所有文件/目录,一个简单的
chown -Rh 用户:用户组用户/
会做的。确保使用 -h 或 chown 将遵循符号链接 。