如何比较两个目录中的文件名(不写入中间文件)?

如何比较两个目录中的文件名(不写入中间文件)?

我正在尝试做类似的事情:

diff `ls -1a ./dir1` `ls -1a ./dir2`

但由于显而易见的原因,这种方法行不通。有没有比这更好的方法(一行代码)来实现这一点?

ls -1a ./dir1 > lsdir1
ls -1a ./dir2 > lsdir2
diff lsdir1 lsdir2

谢谢

答案1

你很接近了。在 bash 中你想要流程替代,而不是命令替换:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)

答案2

diff -rq dir1 dir2

使用 -r 选项遍历整个目录树,递归检查每棵树中可比较点处出现的子目录和文件之间的差异。诀窍是使用 -q 选项来抑制逐行比较

答案3

这两个答案对我来说都不起作用:

  1. 我需要递归差异
  2. 我的文件夹没有并排

受到@Ignacio Vazquez-Abrams 的启发,我使用了:

diff <(查找 PATH1 | sed 's"PATH1""') <(查找 PATH2 | sed 's"PATH2""')

它可以很好地完成工作,并且可以改编为一个漂亮的脚本:

#!/bin/bash
# Usage : compDirs dir1 dir2
# compare the file/folder names recursively in Dir1 and Dir2
 
PATH1=$1 
PATH2=$2

diff <(find $PATH1 | sed "s#$PATH1##") <(find $PATH2 | sed "s#$PATH2##")

答案4

扩展,由于我没有足够的积分来评论,选项-y(显示在两列中)会--suppress-common-lines使其变得更好!

diff -y --suppress-common-lines <(ls -1a ./dir1) <(ls -1a ./dir2)

如果对点/隐藏文件不感兴趣,您可以-a从部分中删除。ls

相关内容