AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 29489
Accepted
ojblass
ojblass
Asked: 2009-06-22 16:23:58 +0800 CST2009-06-22 16:23:58 +0800 CST 2009-06-22 16:23:58 +0800 CST

如何掌握 UNIX 查找命令?

  • 772

我认为我在使用 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 一直对我试图避免的乍一看不容易理解的做法有点困惑。

unix command-line-interface find
  • 9 9 个回答
  • 7915 Views

9 个回答

  • Voted
  1. Best Answer
    chaos
    2009-06-22T16:37:54+08:002009-06-22T16:37:54+08:00

    好吧,就-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 {} \;
    

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

    • 19
  2. Kamil Kisiel
    2009-06-22T21:20:48+08:002009-06-22T21:20:48+08:00

    我很惊讶没有人提到以下选项:

    find . -type f -ok chown username {} \;
    

    此语法将在执行命令之前确认命令。如果您希望匹配的文件数量相对较少,则效果最好,因为它会提示每个文件。

    一些答案提到xargs,但对于 GNU find 这也是不必要的:

    find . -type f -exec chown username {} \+
    

    请注意,+ 通常不需要转义,但无论如何养成这样做的习惯是件好事。

    • 3
  3. Kyle Brandt
    2009-06-23T05:26:35+08:002009-06-23T05:26:35+08:00

    这就是 man 的用途: 很难记住事情,这就是 *nix 命令包含手册页的原因。您可以随时查看手册页的 ACTION 部分以获取有关语法的提示:man find. 尽管手册页可能看起来不友好,但一旦您熟练阅读它们,它们就会非常方便。

    制作前端或包装器: 当我想在 GNU find 方面做得更好时,我为 find 编写了一个GUI 前端,它使用 python、glade 和 pygtk 生成 find 命令。如果想真正了解它,这是一个很好的练习。

    有一个练习目录: 最后,我的主目录中总是有一个 'scrap' 目录,用于在诸如 'echo' 之类的东西不能削减它时使用强大的命令。您可以使用 shell 扩展来快速创建一堆文件,例如:

    for i in {1..100}; do touch "$i"; done
    
    • 3
  4. Steve Folly
    2009-06-22T21:29:58+08:002009-06-22T21:29:58+08:00

    您还可以将查找表达式与“-and”和“-or”运算符结合使用。-and 是隐含的:

    find . -type f -name "plainfile" ...
    

    是相同的

    find . -type f -and -name "plainfile" ...
    

    or 运算符可以将您的 4 个命令列表减少到 2 个:

    find . -type d -or -type f ...
    

    最后,与 find 无关,但 chown 也可以设置组。因此,处理名称中的空格,我们最终得到:

    find . -type d -or -type f -exec chown username:usergroup '{}' \;
    
    • 1
  5. Garry Harthill
    2009-06-22T17:03:43+08:002009-06-22T17:03:43+08:00

    关闭时我只想使用 ; 就像许多编程语言一样,然后转义它。请记住,这是需要逃避的,它很容易出现在你身上。

    • 0
  6. Alec the Geek
    2009-06-22T17:53:43+08:002009-06-22T17:53:43+08:00

    根据您使用的 find 版本,有不同的选项可能会对您有所帮助。GNU find 可能是最强大的,这可能会帮助您解决第二个(隐含的)问题

    例如——默认行为不是取消引用符号链接,但您可以覆盖它;并且 -mount 选项停止查找跨挂载点

    查看本地手册页

    • 0
  7. Ian Kelling
    2009-06-22T17:57:08+08:002009-06-22T17:57:08+08:00

    对于某些 shell(不是 bash)转义 {} 以获得正确的行为。

    \{\} or '{}'
    

    find 手册对于掌握 find 很有帮助。

    • 0
  8. theotherreceive
    2009-06-22T18:19:54+08:002009-06-22T18:19:54+08:00

    有人会争辩说 xargs 选项比 -exec 选项更快,因为它不会为每个文件执行一次命令,但我不会担心除了需要大量时间的大量作业之外的任何事情。

    就个人而言,我通常只运行 find 而没有 exec

    find /path/to/dir -name whatever
    

    确保输出看起来正确,然后在该列表上运行我的命令。

    chown user:group `find /path/to/dir -name whatever`
    
    • 0
  9. chris
    2009-06-24T06:57:33+08:002009-06-24T06:57:33+08:00

    在您执行此类操作之前,请确保您运行此命令的目录与 /usr 或 /etc 不在同一个文件系统中。(否则,如果我在我的主目录中有指向 /etc/passwd 或 /bin/sh 的硬链接,那么你刚刚给了我这些的所有权,作为副作用,我现在拥有这台机器)。

    如果你想通过一个目录递归并chown所有文件/目录,一个简单的

    chown -Rh 用户:用户组用户/

    会做的。确保使用 -h 或 chown 将遵循符号链接 。

    • 0

相关问题

  • 从失败的 UNIX 包升级中恢复的最佳实践?

  • 没有 Unix 管理员就无法生存的工具 [关闭]

  • 大规模的日志传输和聚合

  • 如何及时了解有关 UNIX 软件补丁和升级的最新信息?

  • 您为服务器使用和推荐哪种 UNIX 文件系统?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve