如何匹配文件名的两个部分以列出与其匹配的文件?

1 linux bash awk grep

我有一堆文件需要合并。文件的名称是这样的 -

JOHN_80_xyz_yeti.txt
JOHN_80_xyz_puma.txt
JOHN_80_def_yeti.txt
JOHN_80_def_puma.txt
JOHN_81_xyz_yeti.txt
JOHN_81_xyz_puma.txt
JOHN_81_def_yeti.txt
JOHN_81_def_puma.txt
JOHN_82_xyz_yeti.txt
JOHN_82_xyz_puma.txt
JOHN_82_def_yeti.txt
JOHN_82_def_puma.txt
JOHN_83_xyz_yeti.txt
JOHN_83_xyz_puma.txt
JOHN_83_def_yeti.txt
JOHN_83_def_puma.txt
Run Code Online (Sandbox Code Playgroud)

我想合并 JOHN_80_xyz_yeti.txt 和 JOHN_80_def_yeti.txt;JOHN_80_xyz_puma.txt 和 JOHN_80_def_puma.txt;JOHN_81_xyz_yeti.txt 和 JOHN_81_def_yeti.txt;JOHN_81_xyz_puma.txt 和 JOHN_81_def_puma.txt;等等,在 bash for 循环中递归地遍历我的文件。我可以使用什么命令才能找到同时包含“80”和“yeti”的文件并将其作为要在 for 循环中使用的变量列出/回显?

我想要使​​用这些文件的命令如下-

merge -1 JOHN_80_xyz_yeti.txt -2 JOHN_80_def_yeti.txt > merged.JOHN_80_yeti.txt

merge -1 JOHN_80_xyz_puma.txt -2 JOHN_80_def_puma.txt > merged.JOHN_80_puma.txt
Run Code Online (Sandbox Code Playgroud)

我尝试“查找文件名”但未能获得所需的结果。

Bar*_*mar 5

循环遍历所有xyz文件并使用字符串替换将 替换xyzdef,并将整个后缀替换为chewbacca.

for xyzfile in *_xyz_*.txt; do
    deffile=${file/_xyz_/_def_}
    result=${file/_xyz_*/_chewbaccca.txt}
    merge -1 "$xyzfile" -2 "$deffile" > "$result"
Run Code Online (Sandbox Code Playgroud)