我认为自己对 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 总是有点乍一看不容易理解的做法,我尽量避免。
答案1
好吧,就-exec
语法而言,你可以像很多人一样,放弃并使用xargs
:
find . -type f | xargs chown username
(或文件中包含空格和其他无意义内容的安全版本)
find . -type f -print0 | xargs -0 chown username
或者,为了记住分号的正确用法,你需要记住的是,你使用分号来终止正在运行的命令-exec
,你必须逃脱分号,因为它对 有特殊含义bash
。这就是为什么它是反斜杠分号。你似乎已经完成了{}
替换部分。
至于终止文件等,如果您正在运行一些像您所说的那样大而危险的东西,请首先执行以下操作:
find . -type f -exec echo chown username {} \;
并查看结果。这基本上是一次“试运行”,您可以看到如果您允许它运行的命令。这绝对是一种很好的做法。这不会解决问题.*
,但您现在知道不要这样做了。:)
答案2
我很惊讶没有人提到以下选项:
find . -type f -ok chown username {} \;
此语法将在执行命令之前确认命令。如果您预计匹配的文件数量相对较少,则此语法效果最佳,因为它将提示每个文件。
有些答案提到了xargs
,但是 GNU 发现这也是不必要的:
find . -type f -exec chown username {} \+
请注意,+ 通常不需要转义,但无论如何,养成转义的习惯总是好的。
答案3
人类的意义如下:
记住东西可能很难,这就是为什么 *nix 命令包含手册页的原因。您可以随时查看手册页的 ACTION 部分以提醒语法:man find
。尽管手册页可能看起来不太友好,但一旦您熟练阅读它们,它们就会非常方便。
制作前端或包装器: 当我想更好地掌握 GNU 时,我写了一个用于查找的 GUI 前端使用 python、glade 和 pygtk 生成 find 命令。如果想真正了解它,这是一个很好的练习。
拥有实践目录: 最后,我的主目录中总是有一个“scrap”目录,用于在“echo”之类的命令无法解决问题时使用强大的命令。您可以使用 shell 扩展快速创建一堆文件,例如:
for i in {1..100}; do touch "$i"; done
答案4
关闭时我只想使用 ; 就像许多编程语言一样,然后将其转义。只需记住需要进行转义,它就会很容易地为你提供帮助。