【问题标题】:Duplicate result entries with find command使用 find 命令复制结果条目
【发布时间】:2018-07-21 14:24:41
【问题描述】:

为什么我会得到几乎重复的条目(有或没有起点。)请使用以下命令:

find .  * -type f | grep '082235'
./Takeout-1/Google Photos/2017-12-07/20171207_082235.jpg.json
./Takeout-2/Google Photos/2017-12-07/20171207_082235.jpg
Takeout-1/Google Photos/2017-12-07/20171207_082235.jpg.json
Takeout-2/Google Photos/2017-12-07/20171207_082235.jpg

find 是否有调整/选项来消除每个重复项?

【问题讨论】:

  • 我刚刚注意到 find * -type f | grep '082235 完成了这项工作,但不知道为什么......
  • 为什么不只是find . -type f | grep '082235'find .find * 安全得多。
  • @codeforester 你完全正确,find . -type f | grep '082235' 是一个很好的解决方案!谢谢

标签: bash shell find glob


【解决方案1】:

find 命令可以采用零个或多个起点,即将搜索其子目录的文件或目录。起点也可以是shell会展开的globs,比如*,展开为当前目录下所有非隐藏文件和目录的列表。 Find 按顺序通过其起点,因此如果通过不同起点可到达的文件重叠,它可能会输出重复的文件和/或目录。

最简单的例子是,如果你在一个包含文件foo的目录中,

$ find foo foo

将生成以下输出:

foo
foo

通过运行命令find . *,您将提供作为起点:首先,当前目录,.;其次,该目录中的所有非隐藏文件。这自然会产生重复的输出:每个以. 为起点的常规文件都不是顶层的隐藏文件(即./.bar 文件)并且不包含在顶层的隐藏目录中(即./.baz/ 目录)也将出现在列表的第二部分,没有前导./

你可能只想跑

$ find . -type f

请注意,如果您在运行 find . * 时没有选择具有 -type f 条件的常规文件,则将有一个项目不一定涉及仅出现一次的隐藏文件或目录:. 条目。

【讨论】:

    【解决方案2】:

    问题在于您使用了find . *。说这实际上是在搜索当前目录(这是递归的,因此包括其中的所有内容),然后还指定再次单独搜索其中的所有内容。请改用find .find *。 (注意后者会跳过隐藏目录中的文件。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多