如何在目录A中递归地查找文件是否也在bash中的目录B中递归地存在

时间:2016-02-24 09:23:12

标签: bash

让我们有以下简单的例子

A
|-abc.txt
|-soijwerow.txt
|-AA
   |-oiwejr.pdf
   |-AAA
      |-xyz.txt


B
|-xyz.txt
|-sor233w.txt
|-AA
   |-o777iwejr.pdf
   |-AAA
      |-abc.txt

输出应报告abc.txt和xyz.txt(包含所有相应路径,其中找到同名文件)

它应该忽略类似的目录名

它也应该区分大小写。

编辑:它应该忽略文件内容(只有文件名应该是一个检查,而不是文件内容)。它还应该忽略相应的文件路径。 (文件可以在特定目录中的任何深度)

我试过了diff -sqr A B

但这不是递归的。 (仅显示孩子)另外,它还显示目录结果。

2 个答案:

答案 0 :(得分:0)

#!/bin/bash
declare -a dir2tree=()
while IFS= read -r -d $'\0'
do
    dir2tree+=("$REPLY")
done< <(find dir2 -type f -print0)

while IFS= read -r -d $'\0'
do
    echo -e "----->for $REPLY in dir2 tree"
    for filepath in "${dir2tree[@]}"
    do
        egrep "$(sed -r 's@^.*/(.*)$@\1@g' <<< "$REPLY")$" <<< "$filepath" 1> /dev/null && echo -e "\t$filepath"
    done
done< <(find dir1 -type f -print0)

Asumming在文件名中没有搞怪字符搞乱正则表达式,我创建了一个带有随机名称的临时目录结构,这里是dir结构和输出:

$ls -R dir1
dir1:
abc.txt  dir4

dir1/dir4:
xyz.txt
~/temp$ ls -R dir2
dir2:
dir3  xyz.txt

dir2/dir3:
tempdir

dir2/dir3/tempdir:
abc.txt
~/temp$ ./script.bash 
----->for dir1/abc.txt in dir2 tree
    dir2/dir3/tempdir/abc.txt
----->for dir1/dir4/xyz.txt in dir2 tree
    dir2/xyz.txt
$

答案 1 :(得分:0)

看起来您只想列出具有完整路径的重复文件名。

执行此操作的一种粗略方法是将基本名称的哈希值存储到完整路径,然后只查找此哈希值中的重复项。

你这样做:(未经测试)

#!/bin/bash

DIR_A=/path/to/dir1
DIR_B=/path/to/dir2

# Create an associate array aka hash

declare -A file_list
# Find and store files from $DIR_A
for file in $(find $DIR_A -type f -print)
do
  file_list[$(basename $file)]=$file
done

# Look for duplicates in $DIR_B
for file in $(find $DIR_B -type -f -print)
do
  base_name=$(basename $file)
  if [[ ${file_list[${base_name}] ]]; then
    echo "Duplicate found for ${base_name} :"
    echo file_name[${base_name}]
    echo ${file}
  fi
done

可能还有一些尚未处理的边缘情况,例如它没有检测到目录A本身内的重复,当我在当天晚些时候得到时间时我会改进它。