现在,这就是我的代码:
#!/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
我正在尝试比较输入的两个目录的文件名,并说如果文件名匹配则该文件位于两个目录中。 当我尝试运行它时,即使我在两个目录中都有相同的文件,也没有任何回显。
答案 0 :(得分:22)
Dir1
和Dir2
中的文件:
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/foo
与Dir2/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
来比较它们。