比较两个目录,但忽略扩展名

比较两个目录,但忽略扩展名

我有两个文件名相似但扩展名不同的目录。这是一个例子:

DIR1:
 - IN89284.wav
 - OUT9920.wav

DIR2:
 - IN89284.mp3
 - OUT9920.mp3

我想比较这些目录但忽略文件扩展名,因此在这种情况下它们将是相同的。我怎样才能做到这一点?我想我必须循环遍历第一个目录,修剪每个文件名(剪切扩展名),然后在第二个目录中搜索它。有更好的方法吗?

答案1

diff  <(ls -1 ./dir1 | sed s/.wav//g) <( ls -1 ./dir2 | sed s/.mp3//g) 

列出目录并将每个文件放在单独的行上

   ls -1 

删除文件扩展名

    sed s/.wav//g

答案2

zsh

diff -u <(cd dir1 && printf '%s\n' **/*(D:r)) \
        <(cd dir2 && printf '%s\n' **/*(D:r))

(D)包含点文件(隐藏文件),:r获取根名称(删除扩展名)。

使用通配符可以保证一致的排序顺序。

(假设文件名没有换行符)。

答案3

你可以使用这个命令:

comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)

这用于find列出每个目录中的所有文件,然后basename使用参数替换来去除目录名称和文件扩展名。comm比较两个列表。

例子:

$ tree
.
|-- dir1
|   |-- test1.txt
|   |-- test2.txt
|   `-- test3.txt
`-- dir2
    |-- test2.txt
    `-- test4.txt

$ comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test2
$ comm -23 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test1
test3
$ comm -13 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test4

comm -12将显示两个目录共有的所有文件名。comm -23将显示 dir1 特有的所有文件名,comm -13将显示 dir2 特有的文件名。

相关内容