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

xtfmy6hx  于 2023-06-24  发布在  Shell
关注(0)|答案(5)|浏览(178)

现在,我的代码看起来是这样的:

#!/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

我试图比较输入的两个目录的文件名,如果文件名匹配,则说明该文件在两个目录中。当我试图运行它,虽然没有任何回声,即使我有相同的文件在两个目录。

vwoqyblh

vwoqyblh1#

同时位于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
enyaitl3

enyaitl32#

如果你想知道两个目录有什么共同点,那么这是另一种编码更少的方法。

#!/bin/bash

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

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

cpjpxq1n

cpjpxq1n3#

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

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
z6psavjg

z6psavjg4#

我刚刚测试了一下,它工作了:

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
lokaqttq

lokaqttq5#

比较失败,因为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

请注意,这只匹配file names。如果你想确保它们确实是同一个文件,你应该使用cmp来比较它们。

相关问题