【问题标题】:How does the AND-operator work in the FIND-command?AND 运算符在 FIND 命令中如何工作?
【发布时间】:2009-05-21 23:14:50
【问题描述】:

我的last question扩大了,所以我们分开分析。

AND 运算符,交叉口?

我举个例子:

$ find . | awk -F"/" '{ print $2 }'

.zcompdump
.zshrc
.zshrc_copy
.zshrc_somequy
.bashrc
.emacs

$ find ~/bin/FilesDvorak/.* -maxdepth 0 | awk -F"/" '{ print $6 }'

.bashrc
.emacs
.gdbinit
.git
.profile

当我将输出保存到单独的列表时,我无法理解为什么该命令不采用常见的东西:

find -f all_files -and -f right_files .

我只想要:

.bashrc
.emacs

【问题讨论】:

  • 至少对于 Linux 和 Solaris 和 CygWin,find 没有“-f”测试。也许在 OSX 上有。如果没有,这可能是您的问题的一部分。

标签: unix shell find


【解决方案1】:

稍微扩展戴夫的回答:

您似乎想要两个查找命令的交集。 Find 不做集合操作。 Find 向下(或向上,取决于您如何看待它)遍历一组路径,并将表达式应用于它遇到的每个项目。它采取的默认操作是打印它找到的针对表达式计算为真的项目的路径。 (我相信某些旧版本的 find 要求您显式添加 -print 表达式。)它不会整理结果。对于交叉点分析,您可以使用 diff、sdiff、comm 等工具。

我假设您尝试在两个单独的目录中查找具有相同名称的项目,而不是在子目录中。

假设 bash 你可以做类似的事情

comm -12 <(find .  -maxdepth 1 | sort) <(cd ~/bin/FilesDvorak/; find . -maxdepth 1 | sort)

我相信 -and in find 命令几乎总是多余的。例如。

find . -type f ! -type d 

是一样的

find . -type f -and ! -type d

此外,-f 标志是添加到要遍历的路径的选项。我不相信这是一种表达。请“人工查找”进行澄清。

【讨论】:

    【解决方案2】:

    -并且仅适用于测试。如果你想找到两个列表的共同元素,你应该这样做

    sort all_files > all_files.sorted
    sort right_files > right_files.sorted
    comm -12 all_files right_files > common_files
    

    【讨论】:

    • 所以选项 -12 表示取两个文件的交集。显然,您将选项写为 -12 还是 -21 都没有关系。
    【解决方案3】:

    man 中的 AND 选项

    -and 运算符是逻辑与 操作员。照原样 由两个表达式并列暗示 做 不必指定。表达式计算 至 如果两个表达式都为真,则为真。第二 表达 如果第一个表达式为假,则不计算。

    手册的这一部分对我来说相当神秘。不过,让我们分析一下。

    第 1 句: 类似于数学中的 AND 运算符。 只有两个两个 1!

    第二句:这表明您不需要使用该命令,正如您在 Dave 的回答中看到的那样。伟大的! - - 似乎将第一个表达式与 -AND 与没有 -AND 的表达式并列。 请向我解释一下这个希腊语。

    第 3 句: 重复:在第 1 句中用“逻辑”一词表示相同。

    第四句:重复:说01暗示假

    英文也一样:

    设 p 和 q 是两个具有以下真值的表达式

    p q pANDq
    1 1 1
    1 0 0
    0 1 0
    0 0 0
    

    其中 1 表示正确,而 0 表示错误。

    请注意,这些手册通常包含多余的描述,有时还包含错误。

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多