【问题标题】:Exclude specified directory when using `find` command使用`find`命令时排除指定目录
【发布时间】:2013-02-19 01:53:50
【问题描述】:

我有一个包含许多文件的目录(没有子目录)。我希望find 这些文件。以下让我接近:

$ find docs
docs
docs/bar.txt
docs/baz.txt
docs/foo.txt

我不想列出目录本身。我可以这样做:

$ find docs -type f
docs/bar.txt
docs/baz.txt
docs/foo.txt

使用通配符似乎也可以解决问题:

$ find docs/*
docs/bar.txt
docs/baz.txt
docs/foo.txt

我的理解是,它们以不同的方式工作:使用-type,我们提供了到find 的单一路径,而在后一种情况下,我们使用通配符扩展将多个路径传递到find。有理由偏爱一种方法吗?

【问题讨论】:

    标签: shell unix command-line find


    【解决方案1】:

    你有一个 UNIX 标签,你的例子有一个 *.某些版本的 find 对此有问题。 如果目录没有子目录。 仅供参考。

    通常要查找的第一个参数必须是目录或目录列表

    find /dir1 /dir2 -print
    

    Find 是递归的 - 所以它会跟随每个目录,列出所有东西、符号链接、目录、管道和常规文件。这可能会令人困惑。 -type 分隔您的搜索

    find /dir1 /dir2 -type f -print
    

    你也可以有 find 做额外的输出例子:让它 rm 文件早于 30 天例如:

    find /dir1 /dir2 -type f -mtime +30 -exec rm {} \;
    

    或者提供完整的信息

    find /dir1 /dir2 -type f -mtime +30 -exec ls -l {} \;
    find /dir1 /dir2 -type f -mtime +30 -ls   # works on some systems
    

    回答您的问题:因为 find 可能很危险,所以当您使用 rm 等讨厌的命令时,请始终完全指定每个目录、文件类型等。您可能忘记了您最喜欢的目录也在其中。或者用来生成你的薪水的那个。只需环顾四周,使用通配符即可。

    使用 *

    find /path/to/files -type f -name 'foo*' 
    

    -- 在某些 UNIX 系统中,字符串中带有星号的引号或引号。

    【讨论】:

    • “你有一个 UNIX 标签,你的例子有一个 *.某些版本的 find 存在这个问题。”你能详细说明一下吗?
    • find * -type f on Solaris 和 HPUX 在尝试统计一个真正常规文件的“目录”时可能会出现统计错误。 * 扩展为当前目录中的任何文件名。称为通配符。对文件名使用 * 构造。编辑答案--
    【解决方案2】:
    find docs -type f
    

    将为您提供 docs 的每个子目录的每个非目录文件的列表

    find docs/*
    

    将为您提供每个文件和每个文档子目录的列表

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2021-10-01
      • 2012-11-07
      • 2015-03-20
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多