现在,这就是我的代码:
#!/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
Run Code Online (Sandbox Code Playgroud)
我试图比较输入的两个目录的文件名,并说如果文件名匹配,该文件在两个目录中.当我尝试运行它时,即使我在两个目录中都有相同的文件,也没有任何回显.
Inn*_*der 24
两者中的文件Dir1
和Dir2
:
find "$Dir1/" "$Dir2/" -printf '%P\n' | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)
包含Dir1
但不在的文件Dir2
:
find "$Dir1/" "$Dir2/" "$Dir2/" -printf '%P\n' | sort | uniq -u
Run Code Online (Sandbox Code Playgroud)
包含Dir2
但不在的文件Dir1
:
find "$Dir1/" "$Dir1/" "$Dir2/" -printf '%P\n' | sort | uniq -u
Run Code Online (Sandbox Code Playgroud)
如果您想知道两个目录的共同点,那么这是另一种编码少得多的方法。
#!/bin/bash
comm -12 <(ls -F $1) <(ls -F $2)
Run Code Online (Sandbox Code Playgroud)
man comm
有关该comm
实用程序的更多信息,请参见。
它不起作用,因为您正在比较包含目录前缀的变量。只需在比较之前删除前缀即可:
name1=${file1##*/}
name2=${file2##*/}
if [[ $name1 == $name2 ]]; then
echo "$name1 exists in both directories"
fi
Run Code Online (Sandbox Code Playgroud)
此外,嵌套循环似乎是一种低效的方法。您只需要从一个目录获取文件名,并对另一目录使用简单的文件存在检查。
for file in $Dir1/*; do
name=${file##*/}
if [[ -f $Dir2/$name ]]; then
echo "$name exists in both directories"
fi
done
Run Code Online (Sandbox Code Playgroud)