我有两个文件名相似但扩展名不同的目录。这是一个例子:
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 特有的文件名。