如何在shell脚本中比较两个目录中的文件名?

时间:2015-01-29 01:51:21

标签: bash shell

现在,这就是我的代码:

#!/bin/bash

Dir1=$1
Dir2=$2

for file1 in $Dir1/*; do
    for file2 in $Dir2/*; do
        if [[ $file1 == $file2 ]]; then
            echo "$file1 is contained in both directories"
        fi
    done
done

我正在尝试比较输入的两个目录的文件名,并说如果文件名匹配则该文件位于两个目录中。 当我尝试运行它时,即使我在两个目录中都有相同的文件,也没有任何回显。

5 个答案:

答案 0 :(得分:22)

Dir1Dir2中的文件:

find "$Dir1/" "$Dir2/" -printf '%P\n' | sort | uniq -d

Dir1但不在Dir2中的文件:

find "$Dir1/" "$Dir2/" "$Dir2/" -printf '%P\n' | sort | uniq -u

Dir2但不在Dir1中的文件:

find "$Dir1/" "$Dir1/" "$Dir2/" -printf '%P\n' | sort | uniq -u

答案 1 :(得分:2)

它不起作用,因为您正在比较包含目录前缀的变量。只需在比较前删除前缀:

name1=${file1##*/}
name2=${file2##*/}
if [[ $name1 == $name2 ]]; then
    echo "$name1 exists in both directories"
fi

此外,嵌套循环似乎是一种低效的方法。您只需要从一个目录中获取文件名,并对另一个目录使用简单的文件存在检查。

for file in $Dir1/*; do
    name=${file##*/}
    if [[ -f $Dir2/$name ]]; then
        echo "$name exists in both directories"
    fi
done

答案 2 :(得分:2)

如果你想知道两个目录的共同点,那么这是另一种编码少得多的方式。

#!/bin/bash

comm -12 <(ls -F $1) <(ls -F $2)

有关man comm实用程序的详细信息,请参阅comm

答案 3 :(得分:1)

我刚试过这个并且有效:

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

答案 4 :(得分:0)

您的比较失败,因为Dir1/fooDir2/foo不同。相反,如果您更改为一个目录,则*将扩展为文件名:

#!/bin/bash

Dir1="$1"
Dir2="$2"

if ! cd "$Dir1"; then
  echo "ERROR: Couldn't find directory $Dir1" >&2
  exit 1
fi

if [[ ! "$Dir2" =~ ^/ ]]; then
  echo "ERROR: Second directory must be a full path." >&2
  exit 1
fi

for file1 in *; do
    if [ -f "$Dir2/$file1" ]; then
        echo "$file1 is contained in both directories"
    fi
done

请注意,这仅匹配文件名称。如果你想确保它真的是同一个文件,你应该用cmp来比较它们。