我觉得我是相当先进的使用查找,但每次我使用它我不能为我的生活记住方法来closures-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将放弃穿越分区,但我不确定将会出现在符号链接目录内的文件会发生什么。
那么如何掌握这个可以杀死关键文件的野兽呢?
更新修剪下面的最佳build议,并总结:
我对print0有点困惑,但xargs总是有点不习惯,乍看之下我试着避免的做法。
那么,就-exec语法而言,你可以像很多人一样,放弃和使用xargs :
find . -type f | xargs chown username
(或文件与空间和其他 – 废话在他们的安全版本)
find . -type f -print0 | xargs -0 chown username
或者,为了记住分号的正确使用方式,需要深入研究的是使用分号来终止 -exec正在运行的命令,并且必须转义分号,因为它对bash有特殊的含义。 这就是为什么它是反斜线分号。 您似乎有{}replace部分没问题。
至于杀死文件等等,如果你正在讨论的是一些大而危险的东西,首先要做的是:
find . -type f -exec echo chown username {} \;
并检查结果。 这基本上是一个“空运行”,你可以看到它运行的命令,如果你愿意的话。 绝对是一个好习惯。 这个问题没有帮助,但是现在你不知道这个问题。 🙂
我很惊讶没有人提到以下选项:
find . -type f -ok chown username {} \;
这个语法在执行之前会确认这个命令。 如果你希望你的匹配是一个相对较less的文件,因为它会提示每个文件。
有些答案提到了xargs ,但是用GNU发现也是不必要的:
find . -type f -exec chown username {} \+
请注意,+通常不需要被转义,但最好还是习惯于这样做。
这是人的目的:记住事情可能很难,因此* nix命令包含手册页。 您可以随时查看手册页的ACTION部分,以提示语法: man find 。 尽pipe手册页看起来不友好,但一旦你擅长阅读,他们就非常方便。
做一个前端或包装:当我想在GNU发现更好的时候,我写了一个GUI前端查找 ,用python,glade和pygtk生成查找命令。 如果想真正了解它,这是一个很好的练习。
有一个实践目录:最后,我总是有一个“废品”目录在我的家庭目录中使用强大的命令时,像'回声'不会削减它。 你可以使用shell扩展来快速创build一堆类似如下的文件:
for i in {1..100}; do touch "$i"; done
您还可以将查找expression式与“ – 和”和“ – 或”运算符组合在一起。 并且是隐含的:
find . -type f -name "plainfile" ...
是相同的
find . -type f -and -name "plainfile" ...
或运算符可以将4个命令的列表减less为2:
find . -type d -or -type f ...
最后,与查找无关,但chown也可以设置组。 所以,在名称空间处理,我们最终:
find . -type d -or -type f -exec chown username:usergroup '{}' \;
closures时,我只是想用; 像使用许多编程语言,然后转义它。 只要记住,这是需要逃脱,很容易find你。
根据您使用的查找版本,有不同的选项可以帮助您。 GNU查找可能是最强大的,这可能会帮助你第二个(暗示)的问题
例如 – 默认的行为不是取消引用符号链接,但是你可以覆盖它; 并且-mount选项停止查找穿过挂载点
看你的本地手册页
有些人会认为 xargs选项比-exec选项快,因为它不会为每个文件执行一次命令,但除了大量工作需要花费不less的时间外,我不担心这个问题。
就个人而言,我通常只是在没有exec的情况下运行查找
find /path/to/dir -name whatever
确保输出看起来正确,然后在该列表上运行我的命令。
chown user:group `find /path/to/dir -name whatever`
对于某些shell(而不是bash)来说,为了正确的行为而转义。
\{\} or '{}'
find手册是有利于掌握find。
在你做这样的事情之前,请确保你运行这个命令的目录与/ usr或/ etc不在同一个文件系统中。 (否则,如果我有一个硬链接到/ etc / passwd或在我的主目录中的/ bin / sh,你刚才给我的所有权和作为副作用,我现在拥有该机器)。
如果你想recursion通过一个目录和所有的文件/目录,一个简单的
chown -Rh用户:usergroup用户/
会做的。 确保使用-h或chown将遵循符号链接。