使用FIND命令进行联合,交集和排除?

时间:2009-05-21 22:12:26

标签: math list find

我需要使用find-command管理列表。假设列表在非不同列表中具有随机名称(即它们的交集不是空集)。我该怎么做:

A \ B

  

查找列表A中的文件,但列表B中的文件除外

交叉路口B

  

查找列表A和B的常用文件

请咨询here.

工会B

  

查找两个列表中的所有文件

实施例

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

.zcompdump
.zshrc
.bashrc
.emacs

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

.bashrc
.emacs
.gdbinit
.git

我想:

A \ B

.zcompdump
.zshrc

交叉口B

.bashrc
.emacs

A Union B

.zcompdump
.zshrc
.bashrc
.emacs
.bashrc
.emacs
.gdbinit
.git

尝试交叉

当我将输出保存到单独的列表时,我无法理解为什么命令不采取常见的事情,即上面的交集:

find -f all_files -and -f right_files .

问题出现了问题:

  1. 找到〜/ bin / FilesDvorak /.* -maxdepth 0 - 和〜/ .PAST_RC_files /.*

  2. 请咨询递归查找 点击 !此处

  3. 找到〜/ bin / FilesDvorak /.* -maxdepth 0和列表

2 个答案:

答案 0 :(得分:3)

说真的,这就是comm(1)的用途。我不认为该手册页可能更清晰:http://linux.die.net/man/1/comm

答案 1 :(得分:1)

有几种工具可以帮助您找到文件列表中的交集。 '发现'不是其中之一。 Find用于查找与文件系统上的特定条件匹配的文件。

以下是找到答案的一些方法。

生成两个文件列表

find . -maxdepth 1 | sort > a
(cd ~/bin/FilesDvorak/; find . -maxdepth 1 | sort > b)

现在您有两个文件a和b,其中包含目录条目而不会递归到子目录中。 (要删除前导./,您可以在查找排序之间添加“sed -e's /^.///”或您的第一个awk命令)

找到联盟

cat a b | sort -u 

找到A \ B

comm -23 a b 

找到交叉点

comm -12 a b

'man comm'和'man find'获取更多信息。