我正在尝试编写一个简单的脚本,列出两个列表中的内容。为简化起见,我们以ls为例。想象一下“一个”和“两个”是目录。
one=`ls one` two=`ls two` intersection $one $two
我在bash中仍然很绿,所以请随时纠正我这样做的方式。我只需要一些命令,打印出“one”和“two”中的所有文件。它们必须存在于两者中。你可以把它称为“一”和“两”之间的“交集”。
答案 0 :(得分:235)
comm -12 <(ls 1) <(ls 2)
答案 1 :(得分:44)
comm
comm
很棒,但确实需要使用排序列表。幸运的是,我们在ls
Bash手册页
ls
如果没有-cftuSUX或--sort。
,则按字母顺序对条目进行排序
comm -12 <(ls one) <(ls two)
替代sort
两个清单的交叉点:
sort <(ls one) <(ls two) | uniq -d
两个列表的对称差异:
sort <(ls one) <(ls two) | uniq -u
<强>加成强>
玩它;)
cd $(mktemp -d) && mkdir {one,two} && touch {one,two}/file_{1,2}{0..9} && touch two/file_3{0..9}
答案 2 :(得分:28)
使用comm
命令:
ls one | sort > /tmp/one_list
ls two | sort > /tmp/two_list
comm -12 /tmp/one_list /tmp/two_list
“sort”并不是真的需要,但我总是在使用“comm”之前将其包括在内以防万一。
答案 3 :(得分:3)
效率低于(通信)的替代方案:
cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
答案 4 :(得分:2)
加入是另一个不错的选择,具体取决于输入和所需的输出
join -j1 -a1 <(ls 1) <(ls 2)
答案 5 :(得分:-2)
还有另一个Stackoverflow问题&#34; bash中的数组交集,&#34;这被标记为重复。在我看来,它并不完全相同,因为该问题涉及比较两个bash数组,而这个问题主要关注bash文件。现在关闭的另一个问题的单行答案如下:
# List1=( 0 1 2 3 4 6 7 8 9 10 11 12)
# List2=( 1 2 3 5 6 8 9 11 )
# List3=($(comm -12 <(echo ${List1[*]}| tr " " "\n"| sort) <(echo ${List2[*]} | tr " " "\n"| sort)| sort -g))
# echo ${List3[*]}
1 2 3 6 8 9 11
comm实用程序执行字母数字排序,而bash中的&#34;数组交集&#34;答案使用数字;因此&#34;排序&#34;和&#34;排序-g&#34;的使用。