This answer告诉我如何在bash的两个目录中找到具有相同文件名的文件:
diff -srq dir1/ dir2/ | grep identical
现在我想考虑满足条件的文件。如果我使用ls E*
,我会收到以E开头的文件。我想用上面的命令做同样的事情:给我一些dir1/
和dir2/
不同的文件名,但只考虑那些以E开头的文件名。
我尝试了以下方法:
diff -srq dir1/E* dir2/E* | grep identical
但它没有用,我得到了这个输出:
diff:额外的操作数'/ home / pal / konkoly / c6 / elesbe3 / 1 / EPIC_212291374-c06-k2sc.dat.flag.spline'diff:尝试'diff --help'获取更多信息。
((/home/pal/konkoly/c6/elesbe3/1/EPIC_212291374-
c06-k2sc.dat.flag.spline
是所谓的dir1
中的文件,但EPIC_212291374-
c06-k2sc.dat.flag.spline
不在所谓的dir2
))
我怎么解决这个问题?
我试着用以下方式做这件事,基于this answer:
DIR1=$(ls dir1)
DIR2=$(ls dir2)
for i in $DIR1; do
for j in $DIR2; do
if [[ $i == $j ]]; then
echo "$i == $j"
fi
done
done
它的工作原理如上,但如果我写DIR1=$(ls path1/E*)
和DIR2=$(ls path2/E*)
,它没有,我没有输出。
这是未经测试的,但我会尝试类似:
comm -12 <(cd dir1 && ls E*) <(cd dir2 && ls E*)
基本理念:
dir1
中生成满足我们条件的文件名列表。这可以用ls E*
完成,因为我们只处理一个平面的文件列表。对于子目录和递归,我们使用find
代替(例如find . -name 'E*' -type f
)。E*
按排序顺序扩展。使用find
,我们可能必须首先将输出管道输入sort
。dir2
做同样的事情。comm -12
完成。
comm
希望在命令行中传递两个文件名,因此我们使用<( ... )
bash功能生成子进程并将其输出连接到命名管道;然后管道的名称可以给comm
。接受的答案很好。虽然如果有人需要python实现,这也有效:
import glob
dir1withpath=glob.glob("path/to/dir1/E*")
dir2withpath=glob.glob("path/to/dir2/E*")
dir1=[]
for index,each in enumerate(dir1withpath):
dir1list=dir1withpath[index].split("/")
dir1.append(dir1list[-1])
dir2=[]
for index,each in enumerate(dir2withpath):
dir2list=dir2withpath[index].split("/")
dir2.append(dir2list[-1])
for each1 in dir1:
for each2 in dir2:
if each1 == each2:
print(each1 + "is in both directories")