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

App*_*ple 7 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
Run Code Online (Sandbox Code Playgroud)

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

Inn*_*der 24

两者中的文件Dir1Dir2:

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)

  • 这是一个非常优雅的解决方案,因为简单的逻辑是将其中一个目录中的所有文件打印两次,然后对它们进行排序,以便稍后由 uniq 过滤它们。找不到有关 printf 的 %P 文档,如果您可以共享链接会有所帮助吗? (3认同)

use*_*894 6

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

#!/bin/bash

comm -12 <(ls -F $1) <(ls -F $2)
Run Code Online (Sandbox Code Playgroud)

man comm有关该comm实用程序的更多信息,请参见。


Bar*_*mar 3

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

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)