让我们有以下简单的例子
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
但这不是递归的。 (仅显示孩子)另外,它还显示目录结果。
答案 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本身内的重复,当我在当天晚些时候得到时间时我会改进它。