如何掌握 UNIX find 命令?

ojb*_*ass 12 unix command-line-interface 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 {} \;
Run Code Online (Sandbox Code Playgroud)

(如果结局是倒退的话,请原谅我……我一小时前看过它,但我仍然不确定)

但是由于挂载、符号链接等原因,我害怕运行它。我已经把 chmod .* 搞得一团糟,并且以前在我身上递归过。我知道 -xdev 会放弃交叉分区,但我不确定位于作为符号链接的目录中的文件会发生什么。

那么如何掌握这种可以杀死关键文件的野兽呢?

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

  1. 将练习目录链接并挂载到其他练习目录。
  2. 使用 xargs 而不是非直观的 exec 命令。
  3. 使用 -exec echo {} 来保证完整性和安全性
  4. 分号是特殊的,您正在转义它,因此转义字符是第一个
  5. -or 命令可以帮助您组合选择条件。

我对 print0 有点困惑,但 xargs 一直有点在我试图避免的乍一看不容易理解的练习上。

cha*_*aos 19

好吧,就-exec语法而言,您可以像很多人一样放弃并使用xargs

find . -type f | xargs chown username
Run Code Online (Sandbox Code Playgroud)

(或带有空格和其他无意义的文件安全版本)

find . -type f -print0 | xargs -0 chown username
Run Code Online (Sandbox Code Playgroud)

或者,尝试记住用分号做正确的事情,您需要深入了解您正在使用分号来终止-exec正在运行的命令,并且您必须转义分号,因为它具有特殊性的意思bash。这就是为什么它是反斜杠分号的原因。你的{}替换部分似乎没问题。

至于杀死文件等,如果您正在运行像您所说的那样大而危险的东西,请先执行以下操作:

find . -type f -exec echo chown username {} \;
Run Code Online (Sandbox Code Playgroud)

并审查结果。这基本上是一个“试运行”,您将看到如果您允许它会运行的命令。绝对是一个好习惯。不会帮助解决这个.*问题,但你知道现在不要这样做。:)