如何掌握UNIX find 命令?

如何掌握UNIX find 命令?

我认为自己对 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 会放弃跨分区,但我不确定符号链接目录中的文件会发生什么。

那么,如何才能控制这个能够毁掉重要文件的怪物呢?

更新修剪以下最佳建议并总结:

  1. 有一个实践目录链接并安装到其他实践目录。
  2. 使用 xargs 而不是非直观的 exec 命令。
  3. 使用 -exec echo {} 以确保理智和安全
  4. 分号很特殊,你要转义它,因此转义字符是第一个
  5. -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

关闭时我只想使用 ; 就像许多编程语言一样,然后将其转义。只需记住需要进行转义,它就会很容易地为你提供帮助。

相关内容